SVN-fs-dump-format-version: 2 UUID: 60756e62-ebd0-0310-9ead-ace0535112e0 Revision-number: 0 Prop-content-length: 56 Content-length: 56 K 8 svn:date V 27 2004-01-15T02:38:37.436034Z PROPS-END Revision-number: 1 Prop-content-length: 119 Content-length: 119 K 7 svn:log V 17 Initial revision K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-28T20:00:40.000000Z PROPS-END Node-path: trunk Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: trunk/prototype Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: trunk/prototype/AUTHORS Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 0 Text-content-md5: d41d8cd98f00b204e9800998ecf8427e Content-length: 10 PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3604 Text-content-md5: 24ad15a12cf48e9eb5ec21c8e8182d5c Content-length: 3614 PROPS-END // $Id: Advent.cc,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" Advent app; Inventory inventory; Scenario* current_scenario; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); Scenario scenario; Coin coin (&scenario); current_scenario = &scenario; gh_load ("guile/adventure.scm"); int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); scenario.update (); coin.update (); scenario.draw (); coin.draw (); font ("font")->print_left (0, 0, str); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/Advent.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1419 Text-content-md5: 490fe027183a34688aae7bcc23da036a Content-length: 1429 PROPS-END // $Id: Advent.hh,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENT_HH #define ADVENT_HH #include #include "Inventory.hh" extern Scenario* current_scenario; void inner_main (void* closure, int argc, char* argv[]); class Advent : public CL_ClanApplication { private: CL_ResourceManager* resource; public: Advent (); char* get_title (); CL_ResourceManager* get_resource () { return resource; } void inner_main (void* closure, int argc, char* argv[]); int main (int argc, char* argv[]); }; extern Inventory inventory; extern Advent app; #endif /* EOF */ Node-path: trunk/prototype/AdventObj.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3468 Text-content-md5: 191bd3f68cfb698a00b38b8231bbbe81 Content-length: 3478 PROPS-END // $Id: AdventObj.cc,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Scenario.hh" #include "Advent.hh" #include "AdventObj.hh" SurfaceAdvObj::SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos) : AdventObj (s) { sur = arg_sur; pos = arg_pos; } void SurfaceAdvObj::draw_world () { sur.put_screen (pos.x, pos.y); } Mogli::Mogli (Scenario* s) : AdventObj (s) { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; delta = 4.0; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Mogli::on_button_press)); } Mogli::~Mogli () { } void Mogli::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (scenario->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = scenario->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { counter = 0; } } bool Mogli::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Mogli::draw_world () { float zoom = scenario->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Mogli::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } bool Mogli::is_at (int x, int y) { if (pos.x - sur_left.get_width()/2 < x && pos.x + sur_left.get_width()/2 > x && pos.y > y && pos.y - sur_left.get_height () < y) { return true; } return false; } /* EOF */ Node-path: trunk/prototype/AdventObj.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2711 Text-content-md5: 99a5215386078fa0f14e4eaae650eb40 Content-length: 2721 PROPS-END // $Id: AdventObj.hh,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJ_HH #define ADVENTOBJ_HH #include #include "Position.hh" class Scenario; class AdventObj { protected: Scenario* scenario; public: /// Empty default constructor AdventObj (Scenario* s) { scenario = s; } /// Empty default destructor virtual ~AdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world () {} /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual bool is_at (int x, int y) { return false; } virtual std::string get_name () { return "-- unset --"; } virtual float get_z_pos () { return 0.0; } }; // Little helper class for sort() struct AdventObj_less : public binary_function { bool operator() (AdventObj* a, AdventObj* b) const { return a->get_z_pos () < b->get_z_pos (); } }; class SurfaceAdvObj : public AdventObj { private: CL_Vector pos; CL_Surface sur; public: SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos); ~SurfaceAdvObj () {} void draw_world (); float get_z_pos () { return pos.z; } }; class Mogli : public AdventObj { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; thSlot on_button_press_slot; CL_Vector direction; CL_Vector pos; CL_Vector target; float delta; public: Mogli (Scenario* s); ~Mogli (); bool on_target (); void update (); void draw_world (); void on_button_press(CL_InputDevice *device, const CL_Key &key); float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } }; #endif /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3421 Text-content-md5: 872d1e0be639a96a7eb9a1bcc0249526 Content-length: 3431 PROPS-END // $Id: AdventObjSmob.cc,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; struct AdventObjP { int i; GuileAdventObj* obj; }; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj", AdventObjSmob::make_obj); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; //AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); // delete obj; // do nothing return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::make_obj (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos) { AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (0, SCM_CHARS(name), 1, CL_Surface (SCM_CHARS(surface), app.get_resource ()), CL_Vector (SCM_INUM(x_pos), SCM_INUM(y_pos), SCM_INUM(z_pos))); obj->i = 42; std::cout << "Makeing object: " << obj << " "<< obj->obj << std::endl; current_scenario->add (obj->obj); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); if (advobj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); std::cout << "int: " << advobj->i << std::endl; std::cout << "Pointer: " << advobj << " " << advobj->obj << std::endl; advobj->obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1338 Text-content-md5: f70eb0c7b7fa01943a1c9adbc0152b3a Content-length: 1348 PROPS-END // $Id: AdventObjSmob.hh,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH class AdventObjSmob { private: static long tag; public: static void init (); static SCM mark_obj (SCM smob); static scm_sizet free_obj (SCM smob); static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM make_obj (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM set_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/Background.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1137 Text-content-md5: 41fbc78009ac9425b48e00003401c620 Content-length: 1147 PROPS-END // $Id: Background.cc,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Position.hh" #include "Background.hh" Background::Background () { sur = CL_Surface ("background", app.get_resource ()); } Background::~Background () { } void Background::draw () { sur.put_screen (0,0); } /* EOF */ Node-path: trunk/prototype/Background.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1129 Text-content-md5: ec83e77c30a1ac067d03bff54b97fbc3 Content-length: 1139 PROPS-END // $Id: Background.hh,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef BACKGROUND_HH #define BACKGROUND_HH #include class Background { private: CL_Surface sur; public: Background (); virtual ~Background (); virtual void draw (); virtual void update () {} }; #endif /* EOF */ Node-path: trunk/prototype/COPYING Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 17992 Text-content-md5: 94d55d512a9ba36caa9b7df079bae19f Content-length: 18002 PROPS-END GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Node-path: trunk/prototype/ChangeLog Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 0 Text-content-md5: d41d8cd98f00b204e9800998ecf8427e Content-length: 10 PROPS-END Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3766 Text-content-md5: d4cafb15c8b9233cc27c56843fc92aa9 Content-length: 3776 PROPS-END // $Id: Coin.cc,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin (Scenario* s) { scenario = s; visible = false; sur = CL_Surface ("coin", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = scenario->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << scenario->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = scenario->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; if (marked_obj) { std::cout << "Action on: " << marked_obj->get_name () << std::endl; if (key.x > x_pos - sur.get_width ()/2 && key.x < x_pos + sur.get_width ()/2 && key.y > y_pos - sur.get_height ()/2 && key.y < y_pos + sur.get_height ()/2) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; //gh_eval_str ("(advent:eval \"use whip\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; //gh_eval_str ("(advent:eval \"use whip box\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; //gh_eval_str ("(advent:eval \"pickup whip\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } } } } } /* EOF */ Node-path: trunk/prototype/Coin.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1390 Text-content-md5: dc877aa2d985f948c01ada307a0205ba Content-length: 1400 PROPS-END // $Id: Coin.hh,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COIN_HH #define COIN_HH #include #include "Scenario.hh" class Coin { private: thSlot on_button_press_slot; thSlot on_button_release_slot; CL_Surface sur; bool visible; int x_pos, y_pos; Scenario* scenario; AdventObj* marked_obj; public: Coin (Scenario* s); ~Coin () {} void draw (); void update (); void on_button_press (CL_InputDevice *device, const CL_Key &key); void on_button_release (CL_InputDevice *device, const CL_Key &key); }; #endif /* EOF */ Node-path: trunk/prototype/CollisionMap.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1227 Text-content-md5: b82230dd282873ab161c8a72cf54b80b Content-length: 1237 PROPS-END // $Id: CollisionMap.cc,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "CollisionMap.hh" CollisionMap::CollisionMap () { provider = CL_SurfaceProvider::load ("background_cmap", app.get_resource ()); provider->lock (); } CollisionMap::~CollisionMap () { provider->unlock (); } int CollisionMap::get_pixel (int x, int y) { return provider->get_pixel (x, y); } /* EOF */ Node-path: trunk/prototype/CollisionMap.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1128 Text-content-md5: b83c175529c5c0adb9cc6df7191c3dc7 Content-length: 1138 PROPS-END // $Id: CollisionMap.hh,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COLLISIONMAP_HH #define COLLISIONMAP_HH class CollisionMap { private: CL_SurfaceProvider* provider; public: CollisionMap (); virtual ~CollisionMap (); void update () {} int get_pixel (int x, int y); }; #endif /* EOF */ Node-path: trunk/prototype/Font.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1209 Text-content-md5: 4309e3eb1c6056f0a5156bf989b2e350 Content-length: 1219 PROPS-END // $Id: Font.cc,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Font.hh" Font font; CL_Font* Font::operator() (const std::string& fontname) { CL_Font* font = fonts[fontname]; if (font) { return font; } else { fonts[fontname] = CL_Font::load (fontname.c_str (), app.get_resource ()); return fonts[fontname]; } } /* EOF */ Node-path: trunk/prototype/Font.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1140 Text-content-md5: 974fa63f461f1bb364b9faad2b46ef61 Content-length: 1150 PROPS-END // $Id: Font.hh,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef FONT_HH #define FONT_HH #include #include #include class Font { private: std::map fonts; public: CL_Font* operator() (const std::string& fontname); }; extern Font font; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1959 Text-content-md5: ed8b88eea73f235d81b536538d96e44e Content-length: 1969 PROPS-END // $Id: GuileAdventObj.cc,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (Scenario* s, std::string arg_name, int arg_id, CL_Surface arg_sur, CL_Vector arg_pos) : AdventObj (s) { name = arg_name; id = arg_id; sur = arg_sur; pos = arg_pos; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::draw_world () { sur.put_screen (pos.x, pos.y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x < x && pos.x + sur.get_width() > x && pos.y < y && pos.y + sur.get_height () > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1905 Text-content-md5: aabd9ce9f471cc9d5df9551cc005ae65 Content-length: 1915 PROPS-END // $Id: GuileAdventObj.hh,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; /// The uniq id of this object instance int id; CL_Surface sur; CL_Vector pos; public: /// Empty default constructor GuileAdventObj (Scenario* s, std::string arg_name, int arg_id, CL_Surface arg_sur, CL_Vector pos); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/INSTALL Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7831 Text-content-md5: 0d6be33865b76025c20b48bcac87adb7 Content-length: 7841 PROPS-END Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. Node-path: trunk/prototype/Inventory.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1286 Text-content-md5: dc650d9f359cfd69e0993d7672869201 Content-length: 1296 PROPS-END // $Id: Inventory.cc,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Inventory.hh" Inventory::Inventory () { } void Inventory::add (AdventObj* obj) { objects.push_back (obj); } void Inventory::remove (AdventObj* obj) { objects.remove (obj); } void Inventory::draw () { int x = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_inventory (x, 0); x += 50; } } /* EOF */ Node-path: trunk/prototype/Inventory.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1275 Text-content-md5: 5750c6df1780952732168b37377205a4 Content-length: 1285 PROPS-END // $Id: Inventory.hh,v 1.1 2000/12/28 20:00:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef INVENTORY_HH #define INVENTORY_HH #include "AdventObj.hh" class Inventory { private: std::list objects; public: Inventory (); virtual ~Inventory () {} void draw (); /// Show the inventory and allow the user to select or manipulate it void show (); /// Add void add (AdventObj*); /// Remove void remove (AdventObj*); }; #endif /* EOF */ Node-path: trunk/prototype/Makefile.am Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 550 Text-content-md5: 34e6a360c562e4df4331dc3993dbc197 Content-length: 560 PROPS-END bindir=$(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh \ Advent.hh Background.hh Font.hh Scenario.cc \ AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh \ AdventObj.hh Coin.hh GuileAdventObj.hh \ AdventObjSmob.cc CollisionMap.cc Inventory.cc \ AdventObjSmob.hh CollisionMap.hh Inventory.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr \ data/images/*.png data/images/*.jpg # EOF # Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 11761 Text-content-md5: 39c5084aef1518ac9e2a2710cc307493 Content-length: 11771 PROPS-END # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .c.o: $(COMPILE) -c $< .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done Advent.o: Advent.cc Scenario.hh AdventObj.hh Position.hh Background.hh \ CollisionMap.hh Coin.hh Advent.hh Inventory.hh Font.hh \ AdventObjSmob.hh AdventObj.o: AdventObj.cc Scenario.hh AdventObj.hh Position.hh \ Background.hh CollisionMap.hh Advent.hh Inventory.hh AdventObjSmob.o: AdventObjSmob.cc Advent.hh Inventory.hh AdventObj.hh \ Position.hh GuileAdventObj.hh AdventObjSmob.hh Scenario.hh \ Background.hh CollisionMap.hh Background.o: Background.cc Advent.hh Inventory.hh AdventObj.hh \ Position.hh Background.hh Coin.o: Coin.cc GuileAdventObj.hh AdventObj.hh Position.hh Font.hh \ Advent.hh Inventory.hh Coin.hh Scenario.hh Background.hh \ CollisionMap.hh CollisionMap.o: CollisionMap.cc Advent.hh Inventory.hh AdventObj.hh \ Position.hh CollisionMap.hh Font.o: Font.cc Advent.hh Inventory.hh AdventObj.hh Position.hh Font.hh GuileAdventObj.o: GuileAdventObj.cc Advent.hh Inventory.hh AdventObj.hh \ Position.hh GuileAdventObj.hh Inventory.o: Inventory.cc Inventory.hh AdventObj.hh Position.hh Scenario.o: Scenario.cc Advent.hh Inventory.hh AdventObj.hh Position.hh \ GuileAdventObj.hh Scenario.hh Background.hh CollisionMap.hh info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-generic clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ check-am installcheck-am installcheck all-recursive-am install-exec-am \ install-exec install-data-am install-data install-am install \ uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Node-path: trunk/prototype/NEWS Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 0 Text-content-md5: d41d8cd98f00b204e9800998ecf8427e Content-length: 10 PROPS-END Node-path: trunk/prototype/Position.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1103 Text-content-md5: cb64ab548d2ac24d8be436d4174e7bab Content-length: 1113 PROPS-END // $Id: Position.hh,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef POSITION_HH #define POSITION_HH class Position { public: Position () { x = 0; y = 0; } Position (int arg_x, int arg_y) { x = arg_x; y = arg_y; } int x; int y; }; #endif /* EOF */ Node-path: trunk/prototype/README Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 0 Text-content-md5: d41d8cd98f00b204e9800998ecf8427e Content-length: 10 PROPS-END Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2347 Text-content-md5: d7c843530b6e5e6368e876a1edba139a Content-length: 2357 PROPS-END // $Id: Scenario.cc,v 1.1 2000/12/28 20:00:48 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Position.hh" #include "Scenario.hh" Scenario::Scenario () { objects.push_back (new Mogli (this)); /* objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); */ } Scenario::~Scenario () { } void Scenario::draw () { background.draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background.update (); colmap.update (); } CollisionMap* Scenario::get_colmap () { return &colmap; } AdventObj* Scenario::get_object (int x, int y) { AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } /* EOF */ Node-path: trunk/prototype/Scenario.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1391 Text-content-md5: 54cca2e410b7e582ad43828d648cd23e Content-length: 1401 PROPS-END // $Id: Scenario.hh,v 1.1 2000/12/28 20:00:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIO_HH #define SCENARIO_HH #include "AdventObj.hh" #include "Background.hh" #include "CollisionMap.hh" #include class AdventObj; class Scenario { protected: std::list objects; Background background; CollisionMap colmap; public: Scenario (); virtual ~Scenario (); virtual void draw (); virtual void update (); virtual CollisionMap* get_colmap (); virtual AdventObj* get_object (int x, int y); virtual void add (AdventObj* obj); }; #endif /* EOF */ Node-path: trunk/prototype/acconfig.h Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 181 Text-content-md5: a0b24a0ef1d0f83b7d5dc81c56a97de8 Content-length: 191 PROPS-END #ifndef ADVENT_CONFIG_H #define ADVENT_CONFIG_H @TOP@ #undef MAJOR_VERSION #undef MINOR_VERSION #undef PATCH_VERSION #undef VERSION_STRING @BOTTOM@ #endif /* ADVENT_CONFIG_H */ Node-path: trunk/prototype/aclocal.m4 Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4396 Text-content-md5: 32f164e2aab9f2b057f1113981638174 Content-length: 4406 PROPS-END dnl aclocal.m4 generated automatically by aclocal 1.4 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A dnl PARTICULAR PURPOSE. # Like AC_CONFIG_HEADER, but automatically create stamp file. AC_DEFUN(AM_CONFIG_HEADER, [AC_PREREQ([2.12]) AC_CONFIG_HEADER([$1]) dnl When config.status generates a header, we must update the stamp-h file. dnl This file resides in the same directory as the config header dnl that is generated. We must strip everything past the first ":", dnl and everything past the last "/". AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, <>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, <>; do case " <<$>>CONFIG_HEADERS " in *" <<$>>am_file "*<<)>> echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx ;; esac am_indx=`expr "<<$>>am_indx" + 1` done<<>>dnl>>) changequote([,]))]) # Do all the work for Automake. This macro actually does too much -- # some checks are only needed if your package does certain things. # But this isn't really a big deal. # serial 1 dnl Usage: dnl AM_INIT_AUTOMAKE(package,version, [no-define]) AC_DEFUN(AM_INIT_AUTOMAKE, [AC_REQUIRE([AC_PROG_INSTALL]) PACKAGE=[$1] AC_SUBST(PACKAGE) VERSION=[$2] AC_SUBST(VERSION) dnl test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi ifelse([$3],, AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) AC_REQUIRE([AM_SANITY_CHECK]) AC_REQUIRE([AC_ARG_PROGRAM]) dnl FIXME This is truly gross. missing_dir=`cd $ac_aux_dir && pwd` AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) AC_REQUIRE([AC_PROG_MAKE_SET])]) # # Check to make sure that the build environment is sane. # AC_DEFUN(AM_SANITY_CHECK, [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "[$]*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "[$]*" != "X $srcdir/configure conftestfile" \ && test "[$]*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "[$]2" = conftestfile ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi rm -f conftest* AC_MSG_RESULT(yes)]) dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) dnl The program must properly implement --version. AC_DEFUN(AM_MISSING_PROG, [AC_MSG_CHECKING(for working $2) # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if ($2 --version) < /dev/null > /dev/null 2>&1; then $1=$2 AC_MSG_RESULT(found) else $1="$3/missing $2" AC_MSG_RESULT(missing) fi AC_SUBST($1)]) Node-path: trunk/prototype/config.h.in Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 748 Text-content-md5: cf94392a92f31764d65162fba6c3973b Content-length: 758 PROPS-END /* config.h.in. Generated automatically from configure.in by autoheader. */ #ifndef ADVENT_CONFIG_H #define ADVENT_CONFIG_H #undef MAJOR_VERSION #undef MINOR_VERSION #undef PATCH_VERSION #undef VERSION_STRING /* Define if you have the clanCore library (-lclanCore). */ #undef HAVE_LIBCLANCORE /* Define if you have the clanJPEG library (-lclanJPEG). */ #undef HAVE_LIBCLANJPEG /* Define if you have the clanPNG library (-lclanPNG). */ #undef HAVE_LIBCLANPNG /* Define if you have the guile library (-lguile). */ #undef HAVE_LIBGUILE /* Define if you have the qthreads library (-lqthreads). */ #undef HAVE_LIBQTHREADS /* Name of package */ #undef PACKAGE /* Version number of package */ #undef VERSION #endif /* ADVENT_CONFIG_H */ Node-path: trunk/prototype/configure Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 59360 Text-content-md5: 9d09bffbab855a97db29d9cf7322d238 Content-length: 59396 K 14 svn:executable V 1 * PROPS-END #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.13 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.13" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set these to C if already set. These must not be set unconditionally # because not all systems understand e.g. LANG=C (notably SCO). # Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! # Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=Advent.cc # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross ac_exeext= ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi PACKAGE=advent MAJOR_VERSION=0 MINOR_VERSION=0 PATCH_VERSION=1 VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} cat >> confdefs.h <> confdefs.h <> confdefs.h <> confdefs.h <&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:586: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 echo "configure:639: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftestfile` fi if test "$*" != "X $srcdir/configure conftestfile" \ && test "$*" != "X conftestfile $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { echo "configure: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" 1>&2; exit 1; } fi test "$2" = conftestfile ) then # Ok. : else { echo "configure: error: newly created file is older than distributed files! Check your system clock" 1>&2; exit 1; } fi rm -f conftest* echo "$ac_t""yes" 1>&6 if test "$program_transform_name" = s,x,x,; then program_transform_name= else # Double any \ or $. echo might interpret backslashes. cat <<\EOF_SED > conftestsed s,\\,\\\\,g; s,\$,$$,g EOF_SED program_transform_name="`echo $program_transform_name|sed -f conftestsed`" rm -f conftestsed fi test "$program_prefix" != NONE && program_transform_name="s,^,${program_prefix},; $program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" # sed with no file args requires a program. test "$program_transform_name" = "" && program_transform_name="s,x,x," echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo "configure:696: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&6 SET_MAKE= else echo "$ac_t""no" 1>&6 SET_MAKE="MAKE=${MAKE-make}" fi PACKAGE=$PACKAGE VERSION=$VERSION if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } fi cat >> confdefs.h <> confdefs.h <&6 echo "configure:742: checking for working aclocal" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (aclocal --version) < /dev/null > /dev/null 2>&1; then ACLOCAL=aclocal echo "$ac_t""found" 1>&6 else ACLOCAL="$missing_dir/missing aclocal" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 echo "configure:755: checking for working autoconf" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoconf --version) < /dev/null > /dev/null 2>&1; then AUTOCONF=autoconf echo "$ac_t""found" 1>&6 else AUTOCONF="$missing_dir/missing autoconf" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 echo "configure:768: checking for working automake" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (automake --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake echo "$ac_t""found" 1>&6 else AUTOMAKE="$missing_dir/missing automake" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 echo "configure:781: checking for working autoheader" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (autoheader --version) < /dev/null > /dev/null 2>&1; then AUTOHEADER=autoheader echo "$ac_t""found" 1>&6 else AUTOHEADER="$missing_dir/missing autoheader" echo "$ac_t""missing" 1>&6 fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 echo "configure:794: checking for working makeinfo" >&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. if (makeinfo --version) < /dev/null > /dev/null 2>&1; then MAKEINFO=makeinfo echo "$ac_t""found" 1>&6 else MAKEINFO="$missing_dir/missing makeinfo" echo "$ac_t""missing" 1>&6 fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:811: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:841: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_prog_rejected=no ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then case "`uname -s`" in *win32* | *WIN32*) # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:892: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="cl" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi ;; esac fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:924: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF #line 935 "configure" #include "confdefs.h" main(){return(0);} EOF if { (eval echo configure:940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cc_cross=no else ac_cv_prog_cc_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cc_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:966: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo "configure:971: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes else GCC= fi ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo "configure:999: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_cc_g=yes else ac_cv_prog_cc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo "configure:1035: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ac_dummy="$PATH" for ac_dir in $ac_dummy; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CXX="$ac_prog" break fi done IFS="$ac_save_ifs" fi fi CXX="$ac_cv_prog_CXX" if test -n "$CXX"; then echo "$ac_t""$CXX" 1>&6 else echo "$ac_t""no" 1>&6 fi test -n "$CXX" && break done test -n "$CXX" || CXX="gcc" echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo "configure:1067: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ac_ext=C # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cxx_cross cat > conftest.$ac_ext << EOF #line 1078 "configure" #include "confdefs.h" int main(){return(0);} EOF if { (eval echo configure:1083: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cxx_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then ac_cv_prog_cxx_cross=no else ac_cv_prog_cxx_cross=yes fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 ac_cv_prog_cxx_works=no fi rm -fr conftest* ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 if test $ac_cv_prog_cxx_works = no; then { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo "configure:1109: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 cross_compiling=$ac_cv_prog_cxx_cross echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 echo "configure:1114: checking whether we are using GNU C++" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gxx=yes else ac_cv_prog_gxx=no fi fi echo "$ac_t""$ac_cv_prog_gxx" 1>&6 if test $ac_cv_prog_gxx = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS="${CXXFLAGS+set}" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS= echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 echo "configure:1142: checking whether ${CXX-g++} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.cc if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then ac_cv_prog_cxx_g=yes else ac_cv_prog_cxx_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS="$ac_save_CXXFLAGS" elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 echo "configure:1185: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : else ac_cv_path_install="$ac_dir/$ac_prog -c" break 2 fi fi done ;; esac done IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then INSTALL="$ac_cv_path_install" else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL="$ac_install_sh" fi fi echo "$ac_t""$INSTALL" 1>&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking for main in -lqthreads""... $ac_c" 1>&6 echo "configure:1240: checking for main in -lqthreads" >&5 ac_lib_var=`echo qthreads'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lqthreads $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo qthreads | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi echo $ac_n "checking for scm_boot_guile in -lguile""... $ac_c" 1>&6 echo "configure:1283: checking for scm_boot_guile in -lguile" >&5 ac_lib_var=`echo guile'_'scm_boot_guile | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lguile $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo guile | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 fi echo $ac_n "checking for main in -lclanCore""... $ac_c" 1>&6 echo "configure:1331: checking for main in -lclanCore" >&5 ac_lib_var=`echo clanCore'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lclanCore $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo clanCore | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 echo "ClanLib installed, but -lclanCore not found, run 'ldconfig' and try again," echo "if that doesn't help have a look at the file config.log and look into" echo "the FAQ." exit fi echo $ac_n "checking for main in -lclanJPEG""... $ac_c" 1>&6 echo "configure:1381: checking for main in -lclanJPEG" >&5 ac_lib_var=`echo clanJPEG'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lclanJPEG $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo clanJPEG | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 echo "ClanLib is installed, but clanJPEG was not found. You probably" echo "forgot to compile clanJPEG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit fi echo $ac_n "checking for main in -lclanPNG""... $ac_c" 1>&6 echo "configure:1433: checking for main in -lclanPNG" >&5 ac_lib_var=`echo clanPNG'_'main | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lclanPNG $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo clanPNG | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` cat >> confdefs.h <&6 echo "ClanLib is installed, but clanPNG was not found. You probably" echo "forgot to compile clanPNG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit fi trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). sed -n \ -e "s/'/'\\\\''/g" \ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ;; esac >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.13" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir ac_given_INSTALL="$INSTALL" trap 'rm -fr `echo "Makefile config.h " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@PACKAGE@%$PACKAGE%g s%@VERSION@%$VERSION%g s%@ACLOCAL@%$ACLOCAL%g s%@AUTOCONF@%$AUTOCONF%g s%@AUTOMAKE@%$AUTOMAKE%g s%@AUTOHEADER@%$AUTOHEADER%g s%@MAKEINFO@%$MAKEINFO%g s%@SET_MAKE@%$SET_MAKE%g s%@CC@%$CC%g s%@CXX@%$CXX%g CEOF EOF cat >> $CONFIG_STATUS <<\EOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ac_file=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_cmds # Line after last line for current file. ac_more_lines=: ac_sed_cmds="" while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file else sed "${ac_end}q" conftest.subs > conftest.s$ac_file fi if test ! -s conftest.s$ac_file; then ac_more_lines=false rm -f conftest.s$ac_file else if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f conftest.s$ac_file" else ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" fi ac_file=`expr $ac_file + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_cmds` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac case "$ac_given_INSTALL" in [/$]*) INSTALL="$ac_given_INSTALL" ;; *) INSTALL="$ac_dots$ac_given_INSTALL" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g " $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` cat $ac_file_inputs > conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF am_indx=1 for am_file in config.h ; do case " $CONFIG_HEADERS " in *" $am_file "*) echo timestamp > `echo $am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx ;; esac am_indx=`expr "$am_indx" + 1` done exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 Node-path: trunk/prototype/configure.in Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1550 Text-content-md5: 6f37d85d8231084699d8a630ea05211b Content-length: 1560 PROPS-END AC_INIT( Advent.cc ) AM_CONFIG_HEADER( config.h ) PACKAGE=advent MAJOR_VERSION=0 MINOR_VERSION=0 PATCH_VERSION=1 VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} AC_DEFINE_UNQUOTED(MAJOR_VERSION, $MAJOR_VERSION) AC_DEFINE_UNQUOTED(MINOR_VERSION, $MINOR_VERSION) AC_DEFINE_UNQUOTED(PATCH_VERSION, $PATCH_VERSION) AC_DEFINE_UNQUOTED(VERSION_STRING, "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}") AM_INIT_AUTOMAKE( $PACKAGE, $VERSION ) AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL dnl Checking for libraries AC_CHECK_LIB(qthreads, main) AC_CHECK_LIB(guile, scm_boot_guile) AC_CHECK_LIB( clanCore, main,, [ echo "ClanLib installed, but -lclanCore not found, run 'ldconfig' and try again," echo "if that doesn't help have a look at the file config.log and look into" echo "the FAQ." exit ]) AC_CHECK_LIB( clanJPEG, main,, [ echo "ClanLib is installed, but clanJPEG was not found. You probably" echo "forgot to compile clanJPEG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit ]) AC_CHECK_LIB( clanPNG, main,, [ echo "ClanLib is installed, but clanPNG was not found. You probably" echo "forgot to compile clanPNG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit ]) AC_OUTPUT( Makefile ) Node-path: trunk/prototype/data Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: trunk/prototype/data/images Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: trunk/prototype/data/images/background.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 50390 Text-content-md5: aab184df9827314eac1c14de955c5ebc Content-length: 50400 PROPS-END JFIFGGCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"H!1"AQ2aq#3BRbr$CST4D%U5s&6E ? V2 'ک-fQ@W IeJ4i%橚vqNXܪ _Q@qQt:S7Qy MO+ih|P[(]8$yT&2gq\OaqeoFٹ^^q=[} ȭt%X.= e%ZV],Fh)EP{o8YcEn-:yMG'TmxRӥ_xyu +g>}vMtSp6Cւ4=5R0'ýY^־i"P6#MMncS/ Ft#kZ<<|(d#4uvmįOރF5B>."WQGm׭־)A|Z<}*7t;?U;hBSI!rllܧR&w A*h-z%-x{u?L+ViOܕ[9Ֆ>FMbD5S#9յHC82\BGnŜryǗ!]02?֛1\[Y;B zLǖ6@ɱ ()63&2<\OhZ)# k.k1Ǽ?:8+nb1#lFJE{xRH`yuP.zg:5¨ZGQ*eg ;q{;{4?oC?8d XH>]ܶTj٦.՗١Q]ƧyrQ1%n2ŐfQמ<SzGv֧5lDt2["sl\_rQ1y.=A'7:}FИOm7Y^UJ;Vd;y@&a#V|/-) q5heBD V!~uJ|DSWKg-Nj׋*&'vq7W;Mc:i{:?Y"&˰=4RtV2O ŬyT=+$779%U^ X\Iq?;"#k8bN0rvHic|uM?mrn|;zw?{ষQ#Dm[^TS֧16#Fn z<.BrYk|\-=ĀkНnlHٖmu+sq6@=?qIŵORkqK9%?@E)'<,{D |1:Em-Lz(nBk 'x&~ CjAѼyWZÀ&I>;bѤ^`:R$;iMN.|Eb\.Pʴ,GwR.n:#Jzs1D1I/+k=gaGkq< 1$Ү68.Y^V3lȪ9WCBR <d2Q",jW5" mQ+6>b?P!_q"̧L޽+uh|QӔ< fm+nBnQ@eqWZȱxBàzk IHW:flKVNZ|3_FrNBimbO($C5(QJt 5GB?,i r~\MsSܶi9a&U'6|J7 *xKH{Y>+<#P"dy(\,O= ;u-M# 6[ lkaw\*$*A@0Y3YZ<6)"sH|Ƨ% -wmrYră\'AR?Bv LR o6\dmH G(Gq5,{wy_c妚&{QMhH_·:03pY,7\GH ; MhG^rzX Q6Bk(K7RVQP /d.Қ>oujQ`Q#rhz2ʗN7Od Ja&V[K08nQq)bM\'Y-.[ >]# nfmwAO0c-o'htH*&y_=(93=#x a P=wAΆ7Pu6Ycs7f@jlq^FSjv<<f ?:Nku'u4!%IpَVV&TEn[ h+I_)שЦ(6BGj>\[|Ԧ,sL1$(@_P;h4n~u2}n i{,Ҏoт9I&\\v@yVdjɿu ];{kB 9ηU#$5K_cA[9A*=M0TxCq''vY$sMPPL gbڬ\)Sf\1Uk>`9\\QLTNҜ ν z8zph>+/as)m֖Y,t?qld r꼾jl- ]eYK=iƸ[T[$oMUL_pbkˣ@ɔ+H|C7zh2 Fv;#'+lR8TZ_^D3(.V6U`կ79J ҖJcĖYXE1G=i0!m9֚p<"*Is)iT@آ3/**9j*u"AqR[')0sK>#4z\vfVFED$ ލEUC !PA K(wXW# b X-mg4#z>UU\hN΀ 7֥QG9cCA$l\ˊ.|ۃ#<[Zz(ٮg=Wf8n~ׄy'qR1 B'JD@Pփrp GVXed'ӶZ8BҘ֓m{e{sI PYe?Lr~""5cȇP ^C7Y$%W:QW.&W.YTX0j׷`&1&MXݾ <:hSP{pRFFj16'TwQYq['ނ,D(ڊ[Z]\H-~t-ߒc@tؘ5`ukX%*^a\6g0c@v}<*rČ3Ö[]#oTT^FGMsqS4^4tA{|VRh 0>Vݣ(ʎK8Fcm-%w5X7AMyRa@:Pҗ@ETU<@+/.Nq֘lf\^auV wo5c@} w<0ݎ"rI߆ב͊kh7"pduB}꣯+qE_Fg#B0VPNjŹsL5k|H珮Gqb*Ȉd?xWOw!VklVt=Z Zْ35u7)# #ӿҁ#b^b)hե.]5и=(BùO4I/(]^bJqnAЯMffQOMH l"۽ZV(A[yV5XLv] PS40Qʃa[ހp2ʧ>y}YK9U-&[9ŘiswD~@8911jj}}Vc$rtG#uAB795+:awZ15J?9@/.EԌJQ|x[>okf|tLCI?njrd[U^OaBւR: ^PFIZ0OҲIS+UaA(Zi4[,kͱ֪n*RIyGm *u5^W.OJ.8=~VSZY#ӀCk-e|L)ete^n7ڽf vZuv&R!=J5o4nCUVM*MoÍFU* QF27EH ƨ]$ 7E qdV@ )3ï E78,)-n H(9ռ{HݷS_ G8 o'4LEr k'c vQVnuq3^A,pHE,K:gbLmʽN+Y7,jzzSAJwQ];@2Y3;*v YGc `NaEqxe(!5;m"ڠ^!ur/GR%TM(P0cC7:ͯ5 >A?hUfZ KȳP|6ā>)ukURd3TK$V6 ac -P57)`[<[3w+3nGmQ6Uv8@RwVm0_pI.Hfmc 0kBb-"K΀TV|nf(5܁B$Xܞi0nZb:Ũ e}*:pmZf8i$e*Z\u'Q/zzՌ$#J A\'hNAt^䃘n_<>t-E!.l@mؠKlhpPbT*e}/@$v?,яW9젼FbkK@Kn U[{Ψʬut(v*KKD1L<aRO- ]6( "dU&OF QG~.&ܨuqQrchGԊF>[e[r|OQL|(:`hf;B67 w4-?( яed@*μm٦}P'rxOBƵy12_ImI>(B h#K;A[ Evyq\fqNy8չ^^xx{uQţ/M$^#Ċu(~D슻*P`zvrUHAGqF_3t_J3oen~.[Vi{:g`J)goVEz#g&@{zS <ǓCs,JqOQW 4]tM|km!crSAsUӨc>$[aWsqm ]42As3کe[\:g:R{ hW=rHYrK_C%}ΧUޮOqЩ<Oցk o$4]g% ehǵĕ XɳAMmv# "Չ?Z/f\I$;BK=,~Z \ +Ŵ/H< ke K9Yhr(48_1“;<\¤D9I 1ɱ ` n8=)S7qn._Q7Ҁp߻PY--f(װ&9KD?oP:Pdo6դ*uKivuȤaˍ򍏥A"GF$WׅyTSEpѩW',FKcS;1Ȑ<=rLedl@4KA^=* {˻;Q+܊Zt'4 6H}iWYDN]Mlu\3EPoœ%f*cpf?N2 1^ST3w.N7ZA>!H5-Rq'XSCf_ TP5]}sBƩ Kq񽹐G4ܬhžPNph.`:^ۯ<3؃WD[bOL Joڃ' a/3I|/qC!4+5܍BToh`b?j3xF4Inc\bQ?XŐJȬvEjҠ=(~lnj|UHua#ޏ>adN_5:?U02SO/ [HyߢI;,l =h$<dvSGt)r34͂G;|փcpyW[ ԭ7[s0υf<^g*'yCj~1\`rhkjRIw1u$xDy}5Cm,n>T]&{>*Iv?)=e&6%De6\(zPE80Tvثv >&'>kyxyK5},s%a3i/;oֺM-b}zҷ%Q'E4 LڴDkDjr0/q!b}9ʭ"1C'bF.^ʳ9U_JFr~޵5EA}7FƫM9譮8ҡ> p%ڨ-QZm1Hrdh`(t5qDlד QPRFX628׎+2h@o-ޙ%q÷FBIAK ҙ_ޚT+OH$Lz%[K}m /KK:#ޘ?O}nG+[(dv-Jz[tX X*-q-+M30 @ރb<."c~"b?1n{:'ߥ2sz{Pa{lzψoHLZWy7!`K W~k )j~r.uC/moh-WxJ!\=c[ȳ!#yl.y^”tquWi$Phr0Iv]zKLT,vRCڝs|01.6 9G]S0$+"˻}F$:7kO՘o: ڙ1 9 y9G50,nK BJR/^3ngHQz< Rouj0|-rF:itA`hlk̻|> DgE]9-pWWim}4h,5nRB]SE`ү Nr " n!@sޤL5XwPA:ѥ1!nʘu:*ĪtٌY GJEc\lE#wPmu!ݎ7վ~vQѡNKffNHZ {WLĥcW2EOK޽dRfʁKv[V>܄!Qӭ0ZknU%3sN6a&X-/©QQbp> ܵ*$j\ܘ6RTD]z;ῗۻ49'6G'ies!,g2 p/zh4P[̽t;䱷S@-]@8$a,j T"kv;sjZ :*h9W { y$f^`bHǓ~ƑK>n[wPxZ [$GjsHaA*ݭ˄?2)0$kT{e!ӽMȖF07A26ܲN ?N3ԇ@HJodeGī]7|tGPs|*vpc z\T В&،tfss{4Vsy}LkKrFVF<GJwm0\uK'¸Y%Y`h̼yNmPIƤlm'TŜOrp|Abq$ M?8].L#ƻt4`QҎ;q|:.̌y7$nx7Q/97<,.R݁UnSC.pYcg]:4$>@swB$ tE= \?K<щglu F+pI4r/}UX,T<a>)ri̲5*22uڃb"OZLDɧ[o\xו:Pt:Sʢ |(:=er)ngmY[c)3Gbt4y7M}ƷА77PGisVB(WuJQA/x [44)-дZzV^UIXÕ֓#s\Hc"[[$םj _ZO2tw<Kc2si#bd&xу,[[?␦ڭ:!5e)yZvT@ËL]t]R9InݛnUaJ ITى8)z/[3enﮦ e:۠͏ ۋ{!ͳ})3{m=@'ĒBȃڡa sI(܊zSXч fg3moz 7(U]̬{骖ȎÿQY+O$'{oy6:;Be0v㌼myTK8/on2nq7 |+aW؎nڢV>g_!plS6.I;^:.^:)qc}jn* ܨYuF$UhINRa ˡU KxFS`jǁ^rYk5 w8grWA<^e-Q]CLx9ܞ7#w~7|qD)_3T HnԇgpV z=i\ls 1xkcNf!mjuip_llH-\R «kPSaU;zW kAKx qVYXxzA{.nt'X^KzzޘVfخ7]1jx豲~^^ _c;X&1'Q;#,cC;^63)QU{{]QVf;bBtc;XM4{Af,+{ǽHLI7U;7 ݻ^%^ƠcA;!jP?M?2r x|?8ycȽ4ZXn[i)a;\w 1IRwDzǐUF_JLH<|L:}u]ݯmԒ:uЮIkkWV,>`< .1HPK8w6ܢ^ۦ$214\h12i:oJVs0iϏk~hoMA}l d&g؂|7Avm3}6LLh%ͤ-^ d/(u'4 5Jv ~-ug3Ln !5r3u g|E%U<āOyN+ u]I/\_C Ju])f-]uQæ+Z ⥱Gp:\>1KJF֗1eI (uO!^ڠ39-WՑ c"?aF 5U8ki+}o-l{n44zBFƀoS>cptT_yzG9Ɩ"ΠiE|AAZ3l!Ty Q.Pm|hۉ)x:4!Pw*hPs d-DuSʡ4LG0Q|2 u"&J~%SHTDSqwb峒'bO2uhq,z{kV!q˻\1HB]zV3cJ#J q'x-س^>VǖJtu n&*N?'˱UAɗ / ̨5۔TG#6Oں}*Xwj\𽕔Z6t'>ުp_1|Sw!etc^#;=p6e/+u$P&qn!mw* "M7v?9)E4\p;QBN[E¶*ĶGZKػsII>Q|i?R?:/C;?1 nJ koP~ukl8vENa79Kv>A#(.2B)]]SmĢ\ +;a]҅?J,ZkqEoQF2cJErċCG9+ժpE 0GNԩsb庌h'sNRJ񊭌U^߻?߅侼nyOP;)!OAAPX11fEx+Z Dz{zWBQ }(6{s噻0z4<}MIւN.AMV}G$z%esPn.r7ӧz4$]q|=pҴR JIJcTu;XUzOPƕk@woB:޷FR0ZC @^f(W9  ?4k`sY[|",8O]^DxǬǯV4~T/3Pa9h]TTы#$U =<6\9"Dlkځ c-$:snqBM(=Ye^oP7]'`hCGk#몍;2Ju7.onJ/E 7\mEtT%jWV(TGctiqb15IxF(3>FB9tmŸ/\V1ưJ:NERPemK:^f  aU&ἡv0o-򵼟.8$_[LwnZݏ2>JS05aSw;:®[n4MW@dh)=Wh9h+wA 'G3ڢcQycNؗt6,nHd0@u.c*V% nUwOj;mld*+dK~eQMD.dc(.ʉqČBZwwx1pOJvK $E:5œqIbאliCp~*|! Ab\Yd_\M9*|4ҭ ,3"h`pM㗯Fw7hb ;kBL+cYV1gWbE)]OYrj )>LFz]h ^35&A8G)E J*ʩ8O$i*W#/)mlqRb؋A.AS9`w&Ylc ?ிAV k!U9 XiIt:tBX[sJ]H=]ih=xhEzNOSBxѝ8N^f QE6K^#|Rإl{W(9o;3NX(.R{VsRap1aNFe#(oԚ%}⃘3M éE1 QR܃&T7ҡ屙O&u`(㳷s#yPG&Gvsn[ƽyj F0>Z"'o'26VmrJM 5҃]ak ׯjAMz-Pl4"G '߭iq{[Uj[D:POkuĩ*X-AS, `> rx٤ܝtqܶ|dM1_4W wm$M;؈ظր_q&hǭ:Z2QjlnGOgWBĞGvˎRX"dyo"O=זEHQۥ1[~~V' ,>(Q_cUQqt斠p(+}҇[ Ul%>V쵌L> Ʒ@g%asoi!]ZbSNXP n>Fݹ^>nf<D:J1J H(Po \Naܽ(sqEfSG/MX5XSżIw;BDцijm$6 GgPp<0NZqq4=bcQ1r6~uevB88F@?8Zr dۭOA*[茂zlYx=OJf!k0C*ky‹C>fzkҢmE'߭KaW4zPl`[jr /dHGXjEoz^@WM ?K|~9vSAv> .|&,u\AI&kp/$~!҅kʦMe,zr3 AJ5xxFvWldƃꃙsg'4?`Gx i%(QfA!c-)MrJk+2WU2!-͢!<#׽]<'itddo ߔUxpP0q9 CFt;[*PA*o?P+fa̍sZiP;_\ƈڑٮg=TQpWA7t.!c@: Q$cm‚\MѨy[UQmZvHBa Y(սOmi,Yd*~?@ZZK)="m Fn4rŅ/19Pvzy%ݼB$S*"HY؝ Q8u$hM8f` dtBTxǿ^~k,#$wljb Ue%d !}_u@zU=@bczd?Jf/JƮI!SHUFAr<\Phzޛ1h&(mM'4TSMKǛ:4-(-CU3Nj͏ iA׽ HwAGؓ޶U)$JM]Ģ%;d`hZШ'd@ƅXʤJ !=@J+ĕTfB'|{R{c\A+liAF YF\]UE+GDP.2,0DdA+KQA ÎD[)<͎=@[l Ij`IlO['b+}Mo?$SAe0\*QR8`lR3xd-*0E-sj ]{[No2QYŜvo\1 &\-io4cn̒R{1क़;K1 yG@zcĄ͊U+Z v-]ebwҪI}(F*W+ۧ[6|m豭Q*hZFG2ՄLeyykA?K6"{cҍaNfUi8Ӊ#(*2,~z^ج dndP'ުAT [Kk q.S-e-ˡ OsM/]؊+ B6y;m~F͹~c+ӫAxݽOA@7P?J?7<7HPc-kXr@' !GZno-rךp4Pj19"+I ^?¥V+Z5y[#Q^vQ[F=h='LN+qjߌҦaXBGMic}M{Dî{cvArW,9`k ic5n|Wpjtu=Zc\+̓^cǟ<ͽT{8\RQǽP]$*r7{]q1 =OjR/%$,{RؾG_X8"Qo>FؐK(PYnnJoTcn 6iAN$qq 'L4:j|cP[`(][.b?:LORƺ %@R2^%:Psۢ:oT?u~d,ڦUr䋉džP_ңRG@oae[U#%rlm|dJuikXnđ+40b@4rRި^9bhdiv@swO1*,|y)Cխ  4uUflm\lv0hM~zl^p_d(&B%* ҃q<ԍ}I{Ŕh,l\Ij|5[ UBHb@F-#{<^$S."W^ \Z7M&㤷&;QK`4?UҨ$z֍^*s$pƭGcқ0ְ mBA{l…4{.'ނkdnkUU$YfHiCSy P)=Ϋxᑌ$ڂ #htCqidm׼* 5b@.Pmp#)}*!F@ب`Cm^B+fQ@'"W=7Gq+E;%NP\%1oFXW!DJugwvŝ,>fX1 j<<*yX1¿7ÀORφb4B x0&Bj+7RF%^ ?ALٗ]g_ۣj\B( :*v1C|$cW=dl#L!vBtیlPKm[ȌIU5]dbȣ]Se,aRD 'MzR \ǗtFF}j7Q{c3[3yvPdt;=E|EK-.qd4: DO4}@5<)rAb hz הP+Fb(s!J 感ļ]MT5ܸ ү^PWcߛBѓYh:_IIӎ0?Q]:ɍm*UnYa,Y: ='ljE;;=}h041tֲ[ڵocރ@yŏy)J.|}hk"yχH43~&]dALۃ`Um#J9b7&%)9;E&Rh {/&PBUTPii_dC>(|aZ r8c36~WP̪mV⢑kހ1ݤmj^Is~Іky{f/%ԞSY ነOJIZ)m\U|3@;8Vew@*>,h@2S0&E>M/]wX3:wdiO7e@d. G.!}ν7H`;pU7J QqbVA EL tNaM.O?:'rkOW4:$76k]sApA1=hcТe9zyeaF!+u1ws&@o; ; |xCH!0n!>Щ~u'"h1u֩Y.Y֔1ul…bbkzϰy;],5`5bc7l Ahx8Q(>P\|pS\֑\]*MI>e:ݏxg5M #P4̣pFt`lI'~׋gqӑco}/PWo:TM=2qX=J%jlrB*i=k{)ldv26i, ,ƭ*;^,fjZm1?t ׇa#p@:L68#1xjr(x$Q,¢6Tnst Vld nbk1Yj#[z3ۂ@w"M7*O/wy.ܧ$yR2a^E!W 3yOn_Nu= \NѸDآ'Gz %ʷ(['~`wڪ"VNgڪ]A7js9@XNWd7HvV*yAd;sF"~b8~GVI @7Ud"KrU4/q>~)nx1m Pe/r7aҗEKj If!bbMR8TB*d8dAT;RXSBy^kl }ą F+. I6Ni3~uTH}h|wr5^(_xAh XnYWjHSEqE Ы}J^mFԢ±l{n$k҃aF@#ֺD .]"0[r<Ǡi3!@|h bX]lHח׋5q5P|FI3\GmvYP;\\NIY?Zsq!؈[͊{[eMND.%|zcbfNk}klL5-$Ԗ (^Cam%6ϙTrۚ[~g;`VB9U|.$jN;{J0J@Lv/1X|; О ܒOS@R( Bx`.!u߰5nnUUo~Jl-e䣙c;ުíte }EIna F_B;#E{Ƿ)X>kmkkp P]: Q^?Bg{_z !EBcԖBt#`-N CF\{PbƧ2}W8 )Ճ[HK.([Vk@Iںi$$?d}|cE4M7,or/-X=NP|cdS[4%":+抃 n%I jJKi$c~r X2e0ܺP󢑕 IT IdNmC] Yl|(K3s9|4_^m,0)GJ 7orF+/wGiA$ZZrG7@[M4&KY V*'vSڭPhՊtzWmӵi!ޔz傎j E#'aǻx4pp٠bđF^]+}d9zy\/xV,4a,f}l֯\.#\tÜKqki"Ec$̵[n$xʀlmQ'Ⴏ"bU?e\ >huC,5t>,EaSҹ$o\dҜVF `8eG^^`٧ؼr΅|"J MM\72A7bt)^yH51ڙ?3@eyzWV`hPnHJ@m2,Ό ު^,(G#RX;72H "T2j=M'rL#yO3ij)sQ'D=kCWNb k On:'-3;9'~ۭ<\tccK,Wy& 똂[ˌ"hOV$We 4@s4M+ v A$?1/po P#2}֯q˿Q^pj¯_ArD\O@R 8#ld|^G̣un[&>5n$;b!ORk5qN"2 ߹ק-V/YeeÒ7(lx VQK9 骳4v?@bKt ɐ>Q!^I7H<_k&2x6F,=MeOjŭq`yyUUI#뢝MLa2Ss >v+bsͳkpxr42i2AzЗCƁLl0ֶi{h͘>QM `JWcK4I?=<@ȠHkWMʩ!ߥHعUYه,t)RK(aF 'h(N!Z~nF'Jzѻ^4ǭr ) *[ZWCe*)'T+'ޛ5XG*E,S҂[m NBIX/ t +ѕX_㤅$:l"[\M'kEe<*]:z~c̑_0$זIĐCָ|U7@#~ݠttڃit´ۘ+9dnzCڂ]&ǘk_Q1u{9 zW۠#@fV@~t?,1}5S/o${62Z"{3SH9K"@bndOwڣ,SkktiS/OuTD}ݷx"Cށn Ao<|Fs~6 ]w' '"E;D[@ ހs+,DcZ,^=@z5a'X.[Ly5ۏ4E7'j{'ۦV2\Lhߥj"=,fxu_ dCm8߮RZkBn$dAІ0$ȱ(  ]!E= 7[.>.$ ;T쯽S9m" D>.R7B-})8G)賁w!UIձPs~^IFmcO%jG}X2$ZpůH'.md)|k㸟bQŒJNro¦!LxEWF u| Cv.~gIJkXn ݬr0mxށ$pRI:}h칻~6LuV]u[;1?􊫕7`:HNɠx.'Gm59k@ZǕE7CZ2@P*P/Iq$H-c]k?d rҎ^mPL'^~҅0W Y:{t_kI5OVSc*#S\ Yw5Yb+h>+cp@to>2B?El?olx>h;8Vl۹f5?MЅc1~ qp6+`{B^3u߭Rw, v=G03jHtev{d' AH9ODG.cbs$;MUŵ7}_b8,71%RV1ml[EYA<U[]ؔ9^S ">2^3 rDZKiouS55ށ]eu]c,6ҹ]p:1x>sֹXpӆNۿ^*Pa"F}*cn⛯K8JH4ŵU'4Gefz1 j2Fv ;kuTVA[(#@F [+\jѻ50"Kr~yf:P>6(~#,d4LfE -H_#X7>UE#aK6mcX{;iŽ>Z&[3pOŸy FѦ{X _z?dH@\&gRf\ X,_i02قPyujV@e"dd k쓼-f5wbIm6&eaAenx:2q;J H,%%ʀ+abGր؉% z}jBʝzgx(]xR#ˏ th?a/!SGJ|VQp_OysPiֺ>N2C$q\3r9r\==)ݠ{$$bʽ6j |DF7^%̋n;52³qER;HAD_w~T72:703(mqRks0[ڄ>,aAs|BOʱKU;Y1 ]b+s *9׽3sQJwcLgE^6=R7TUY+>vTSBqtYxDXk7 Is(,uT{qznZdt#GғFXV?D<ݍnmrҲhڦ{ɅMcx؎:&A~S3`)kt C֖,|golyoYkUm1clXX`Ʃq5 b |V1Xx_ 2;6Rpo"XiK | ] XoXeoݨf/"1:%0nm}*<.(Ӑ$5S0uZr)w+"D?0=d0ZaF+whRK<[LoVacnEPl.&VV`_z]/)ufV.6 b^9 !pyOZ/ṁ&(P@tʢ4 Qn%`ikx )˸opi<$T]3T+Aͦl&R{U5v nHжO`i+>ԧĘ9b2OEZa-x2j;zׇ_%<$1?UcV7׭*NUp+< U{}myD(jx"hBísgN9+&xsj۸[]Pr^2񣵺UCx=ɌӵT[{}}vdM?9KսX4FKfz~/lYSOzt׿<|\܉GZqcL]μZ>#Bj=wRh>ԭ V5xIRo /Ø?5J߇-̷]aI$U\2(^VbI-|i9 ֍_K<)S/,KT>J,`sqhyJ/tmd#PcRŁrII ׇ.#e 3 zՓ%խC+ʗADeăJ99-~V;#֎.NY죉NŘPOiu-]]rFyuV7b&xguS[Iyc9 O@zU%/ҟx9ff'R!9 VB v :v٠<0.]i}6WJSgfQR`c&Ҁc::ʀxt'V q-Dez;f`w=EU\QJ!uFBW$J:vx o+pQe#[,̇A<\ȭPk*ǣs cHR$V=jc$@!Xʟr\AH:|d-ºNf=c+fT,чJ̗WfE(H֐hP*?Z@GPI=8ݸb\C8 :R+{~K H@W@{Pr 她XlB Wt,uC`i)% UrҷШ.ռ ҈Kf`} @nҢF1.ζkg#ަ0РSX5PbhOf![]`9e^q\Ng_b$=P}+mmg"P{UAW_֑WMvD FK4:yRuUۺQK/Os˼4 5ƻl<Inh87i{`iKYLz]s?~4 w69+_ y_檋99'H.;\q"9$ !cڢnde">z q8 W"źbPoF5 > 71U|efM{ eocyVx~V->/‡r%z#RO=ͯVU(:W[i7a_Jws6JLO)=(F;Ld? 9X$70$ǣHt|@/%1t5Bd7_SA6mZiqrvy.d}M6uj1mshIShz]Nh1O$_ؼm$RIJ!zy.I>\]Bz/֬D fL^nϒd$^()¹ċ n/r̍3pV("^4qP~a-/OJVp\#r=鿇8d-r]%)$Lwí xf7VSڦͽ`nI+W0lxIkwC2Y̶RFר#t/,]')=x[r.#xg 4J݁خgˈ V#MP֊5|ݨMwC Egҁ[1RfoaOmA8{"6 MSuȉ!ul{L|+ Ƶwrى\l FHGň++KkNB׭K|ZP89^nleHm*,*6 mo.I.=jl=K*Ɇ~*$E]K #\:<5Yi'.$JIF:%ڪ'~m$O31#߭92&$veodZ&Mj,lAW/E,(ֆK0󕵄OֽX<p~Y-I_9 }EU4NKR^w!>Nw:uUNFV'_Zs*oCCrZ!mH\ 6ɓÀaV: +iF䶿'xV&9mȅufcQKbE)!}Q|kw?F8%Gn]P=(HrR1ې.2? Ts/u:CfV]ts6ꐾ9YX|)qq'hr#hFƳG{G r/4rk}^rՔݿRƒN *Oj~ Jcn_8[ .MWPͶ?nىVc.k@x‚M=4+}_M K+@5q r(5U$)|9&U?Z}\x unSPݡ%um2Ykwⵑ):|֕#^vb=:ևqT ![Ǎց'O,K #҅Csom]~IuDv 5ރմ_cڦ[+}yoOΣ^Ĝ#@\YڏgdHE0й@3E0I1\s(5_霻Q-⌑jG |Xݘ1BA70;@ߎkԟ\`zgyvɛ+"-Cr.:/.lgAgRun(IWcFZJkUnaCL텏T}y&'UV rMA-o[b {&Jq勓~Ƃ3rWʹŤ>rEȻl3~^X/0gsD#|l#cmStqoJ9$t_C@nBB$w6T׻P]thwaVyn҂v9['FK鏿%G{ᛛG50pEqi;Y479ީ-e)%+r+> eә|I]S, ܃pY(ܫ!om_g[u{PiaA-n>&'!]X#J rHoH`ua,-+"6<%.Tdn}9kTa_MÄ7*. x- XOQI;DA' gd<35~_']u8#c4QU吒VFHoP;O3fB:~H70O?jhBF?{xؙK{@ò% fV<Ƨq5R 6ۤ{f s"zZ\O~qtL/cv@ٮ_6W1'J' :[}dKZ9X- @G^fǃ"H rs#ž:+[9Y+h,ꇽFu.^qK6h~K|Mx"È |ucM[+~'-MowЊ&y @4M)y 1D< g]meo{˗~f(l;IVҬ[OWv.wj;pU>'YsZ¬;0QFqvUՉ=F.GNG^_zR .#-A]cTg`K;Z(2lIs[6x yu~ s7&䑀X\َ/tI) #,dl}i–vg_ޘ{hCA NnUh XIXfs%.$RN"qm-$5=}M¬.!eo Ct-} 7Fv"pvF<6Z/-R e^s T߃B#$ރF9y 9oȼGPMLsΞfl[X\jT;8F;VVPe.G0q֘~)䮭2vY~w@"I8ϔyp0:ŕ_t,Vlt xkGKa`MQNiS)rDͽ)eZBI<@\Z ʰ=5Uht;LhP17uqzU5Yyݎ4)bK.@8 *坚8]usg( O[_FE=۴~n+q? 3 ; Dޟ_D-2r co0/B†d:c{}e%xH"a@{"sEwN]ES>=4'OJX&WuC󣹌zVWg$'7#TG-N,'PUܩ' E#:UnˎK+oo〗^}ǥpYmJipp+~d9۫C@YYYA2e23GԃMl@R}yo#@ N_MP2rY/甏Yx j.\4wyu(+*^)}[Eg-!cUe>Cnq r[t H A,Vx#w? hpެ/PnZ[H\֬f0|۩#G;N$dM*<(?MS.[{(^{i}d5T].Ѓ ʎ 㸉d)(3Uk(<{YYAeeeP! r9`:Zc5Go|xCMxf Gn-b4˜\y{ۈ-k(E!V$)>MsWP4ka*v\I Z8f@z}jի{3h)zX"]Z4ܷ JEg'l\o_֊Y| *bքU[H#PW戎U#چ3] & N;V,%۱5"\ʴIU@b7GQK u_m]c2#G^ hT_4ҽi8hzqhIo+nmР!U) ã4=ktXnւY7; {ɍeu588({6W^@+=fxQ~-yZ$ 1p1;Um}P I4aAhGSPxkBkٴڀ~j/YuQiVH% 6V |Y Aĝm9# =y'Oҥn.$"v=*ݵm!ePW#_J0:YZ~a?!ؿڂ $(M"%S9T8Z9?QF;G6t#2sTҡ;QQlֽ1V+Qڸ-}SݿVTrUF- GS:йBzOw4#hF *R6h2u{Pzi%7TʼnBPڀV.Aƃ{n, Vⴧ4qEs<ɞu}(xO2C4[ [,+w?8ṧ]DLtAslB<=u$P(&V\ c-(?d0ɮsw1Jg E60`AslӦ%7!yѩd;a[t6 zz׶i*&nR4h9T#c1`]c#4zc9{xJ}i+S{rœzF MI=}hr?7ĸwyb~$ZO 43xR-b_deh%"]H͎HGMq:, Ori3068;K&1]T*]փrrέ#ڊGv-N(-/%,;Q;,7X4RhL6<ΫMen})woGT.'0Oή:P7yV?gKڒn_\o@v8IqyE9[ը?f nj @٥ڰL<)>ɑBk\YM266fyd?j( 7r vR9st mfq/%Q2ݷL_7:lM,Č}uLv KuiLl;-=oVglb]}ȩ^vnZ=,$?J<1ʤv$OڀW鍔u/kTXōVEz~T)\aDI7͎uXG~UdžkxJ۸q{J[vWo³"Cw}}-('Ze-hS-+czV5<ċ<r޻bPRA)wk?i~1XMg7h ]~!+dՍ6{S#oXPE8ʂqjvN>̆eog&Sn{|9zd.R>H.Wj 3=/^0Y/n" ( qes"pχI^xIv:{P^1}U$9ujPܪ LcSӐHƺAmӏ\B/h[ _FDalܒiJt .?;`"(ƺP(i$QҎ`6`\7ܖ譶bzJ9k E ̱')W\Jhf8,\-tѷ+<0hQk Ue qSZVVVPx{uu/IU׸$1fϯ(3ETՔ?ρ"VPW+_x+߁"mHEʧA^.mY9@:jaAϯxm^M"8V7AnC\; `$7_WqM})JkFCx_w@,&ۨSP\ڭh>~dAf9fWA[SOQ fBsqPƀnI;Txҏ(A9?*ׄ843/V1[Đ5ͺ*>ROނb#md5]A;T tPiwW"@hW-<]|J,E1qI,GR(P>Aj BU0 i#6y" F= d/ElML2Gcp)+ȃ~л/˨yp@\Pte` }u]J+++(2dt6͑۠%K@ HQL"$( ! hr3Ӝ'P!?+gfzڴ63J+ҘWPuҴ[ 8Sڄ^vrț21Tkxn K38^u]ރ/7m=hdv\w?X٥nttn.ycKHƹ^]ծqN֤Q,1(4?*i0w8 spQf%Cl-_問Dqo]'"Y\o/׭D>4zG~3wrb 5]j1좹'Ie=sc$Γ2H423'MKWD,.,1 pDց-c,V (Dd mFʡ'ުd/e^bHZ ,rd}( Addx"0oti2+"k[]xA\z] ڪ۝.VVVPeeeeVVVPeeeeW:{AeyYAݺ[F ,'{Aߊ:}hca{CL`aAҕ0$ćj;xzhzPo$vB>|m_j%L40-h.tXzE1+W^x=گ[*HbA(vUFdKHPkBm5IP XzչzsQ[fW"6@ܕ]Qrҽ9{ N?{rcSc2ŏJgs1T(*~6ꪗc IG"tV7#A@0qh!=)+8(CȶTrq@rXBZ_B`^rK)D7[zoh@ס_;hzsu vM$Jn]D_z$ @/8p :*z[eo5ߧ}#wh5)FH"1A(z 0>/89nԹy G@G2Zu&wV>yX@}(nE$71 ;<#P#4zҲ7K3)̉)-5rr3Fʹm0NU` c|\R 4!ֺ|\uij]ttCaZ+[獊jO# DN}0p[̀:& z{R7%}i_q[OqbLt4̷LF YQؐmՋ<5Gh]) - nXG4po ^Ay(} <0KJoz>'/u81'5OR$ B瑴6hdn-r\?#>cG dq;[u:5θӆo4\Kn;ǧ\KYDΩzeLoF4{?n]u1yEhҌ..}+iBxK;.L 7yAsn-ofHEjGN`( 2Ut^a@7/pY`#~W%;"ЉDʊnᬆEVKAn}JeeEk $DZ.l⅖;#F6̓ BAkZN eb  =Es)* *7,"r{j;{YYAYYYAYYYAFVA%&ؐ$LyԊ&,k֭g>[_ݏqB0 18}z3&R7@D{حϊ,%IXȼ;m2y$dV4"ҡGx'>cF/@&Y5̇~\/xT4 v#HOkorZ.PIפJP T{ R w"[[mb~HE{Q<RkGu߫(@ي1 +@}BY +AV uWA nA LG7نk2%S3p:?1+9v$Pnl4a}ͳP۫E;@;VoZXrQkJWIĕ7H, ֹdnd܋fmro`@x90]zaUEV,? MY(res$Af|[s;RI2Kfڙ04y0KYIQ@%:˒/@~.W) 6u8zh_8~kC6!@dQ݅F1 sێ1-UF?ct[ǐY]/9L~d5BdeWud4IHB?1nE1:-D{OKv{=TUdi5cޭ~;΃1lqaB1O ozQ'/ּbbh-G4vVRpLhvޞ}c8U[[e}j[-$-@¢BP5B]82q|H~Ƅ]| Uhgq]=/Xm`|K`L)nMY.Rcq#ؚC1R(N75采}(.^uDw:Rq~Abȫ5dË>$P0!x+7z &֊ֳ~oi%FBJ '<O51IvxƺY.OG=n8? \܌ Sb8r AuRJAYMse %G"L'sA5\fuI3jQi)> ϠPV8.?oYl ~m/ tWT76[Yltyl;ώUۄu#~Up}C}A>/ .`X5C J$5Ãj+m4]kďt M{jIv0P#Wl« /QAVխ-M)4'",GN۝u;mP%%0XX܎Yi|P;i2w#|UқaQ=Mi9 @]Qp<zVck}hw4}آ1^$*ҵXTNAA#b?*8Xel#זCT EOԋ a˪1VZd]j,*:PLqiڵ6 j/P~1j ~^sO]-5҂\0 ~&> uW9Pu5%Qk^ 6E[[oV\~HST[=|-do!Աڅ=N3(Ԍy;UYeuG/FTOd#j@>^6)Th YYA]obh0mAڃ+++++(2ebY\t']Eq*AHj;qKȲe-,q1*~J)+22.w=eUm(f܉<4x}r{8EdA: Mu}6N_a0Ypcf2蜝OP[arI! vyQޖ7|D'^䡝 Rj l9WW@6$htXD:z?51X}P xͿ{Mo{uo6/!'ӭR4(=\;4CT`v!ۦ}aA[yo!qHNVA?T-Z$/[Q{HZ{14d> .&ƵFd+574~Pz}(%%뿵F~U4Po5\t]r̄~T3)rӅcЩS |ғQ -AFQ"+ mJw`msW ${P]RyeT'_Vv>~x C{U62i} 9'r֦w͓˶y?ނGe?l.ӥdv={ю]XT5UG}7.4(? Node-path: trunk/prototype/data/images/background_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2338 Text-content-md5: c50ac1126d22c5f5a0191122e0ebe3dc Content-length: 2348 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH pHYs  @AtIME /qIDATx;dU0@GTtwխ^i}ZEIW[H313$?c ($*9@?a aHTz7OpiS;}TK~ ZtbJitbJ<(yҩQ&=SHzHd|K',cRVw?R)sKX7d\|]%Ϯ]Wi\tӓJr9MO9۞P˒n{BJ.KNK{;0o*;'J{C}Rt[ú/*' ZJ%1c7uS0rPwCޟ.6YCTZ P-]MO1B]e&]K%kVۋIFE "ep{0Cco[>̐F? $}TƕVlCЋ?,Y5dIg~KE~1uzQ$)j-/%(^ObuٌtJ_:qIϡ]:pK[:oDt<-F騹Iz}Is,sa4IΘ;1^:a`xY =jgruuE<!RDooo #T0 !x,//%WRl aBloX =AXufydY˗/ߏoa<`0p8p8t{hhD(hFXD6E$mx]ed-]b1pIdoo/ IRS9V I&&&l]h(:G|.ëWѣ~?pzzjfEd2: $ ߿G$4L< po߾ N5R)k~ZӘ0==*EQT,Z>fC__}ρkrcxJvgϞ)cGGGkBDQۥ&DQNZ,3VFGGf@?nYAeb ޞ>5!"|CA,brr@$y9yW8|>]X.Ifff "#">}8&1HIk*Oܜ>dR!a^]HWuMjxs޽SfY>|0_6ALфB!|# ugggM:yaSe###*/twwW8kkk<ӊvŸ? JA-Ǐ- DpbQpyK>b(s BR8&Uqj qe /N[vm- RHD677ɋ/`'8Evo޼i8;L+~;c&&&緛BuԺشu$!㸾e -H˗/8??W7cQRׯ_A@<"qyyö?ЉpŪ5㰿wvv:z{{߿ckk ϟ?7$V+p-%a+* D²$hf›}ܢZ|4c cw7VGث;UP Os.BҺ,HAD~Qz2_NִPi>~Q%\cAzZL [ߺ%t%V\-ybxДm`3%ED,R } ϔ-RXn^4^SȞ{  u)^3S kAb[ٵxiiUe%SMvt t15nd瞬*kA}]ׁ6 FhU 'pUOyZw-^T  ONiq6DRxCqᚙZZ I'J}4I4!v#Cr-lʢ_48H9>M"’tI3Luf{YH$bg1NJ͕Љ+k;KҖX$ycQWuKtI EGEճ3HPSx1_{gRbܬ0EpcNͨN{YWngS>k5+i,;W#:W2q 0| h)uW¹}D1 9(JvR|O2=M@\rJ2u)V) 4K vRُ=1.%]Tf2Dx+¤$\F%IENDB` Node-path: trunk/prototype/data/images/coin.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2537 Text-content-md5: 1419b72c7faf7a167d34689f4bc2b484 Content-length: 2547 PROPS-END PNG  IHDRgAMA aPLTEĐttt000ppp```ࠠlll___NNN999MMMԎll$$$ddd\\\///TTT@@@PPP888DDDxxx|||444<<< 䨨hhh""",,,܄ ***&&&KKK666LLL---===sss tqponmlkj~}|{zyxwvusr(((̑HHHmmXXXmmllllllkkWWW kkCSnitRNS@fbKGDH pHYs  d_tIME &IDATx{F+ȎcZJč`2MIVt=Hi_W$e{?zo:g"*A)ϛϕʕ\,[i0 >,{fjNqZ@гn~?Kh91jJR13#7jιTc0\ip!~V \7-@/nܸ ;~Q i[RJt2ڬF?{ZR`,%;~ өܔֳpuA~DkzVKHpRthN\Ϣ2C]ws}?p`Y'b˦"g9ÄAR*[@td+2xJky\?Zy?x-+{pN w*V5n#H o vr `1PI31Opb=tsu5 %|d ǁ~h`!-+MruegmS2]C^RV+.&O0٘t4;Ex2u8@KkNRJv:^&qjupA>XxbiQɘp.|R=#h]DWgL͐]oni }X*#xqoz>O>/ט=qkD%|"{ӗoN뭞WYa/^uOIT iD!z#TҖE$4,-h7ujJ؛0:'v#d=qړnhn](r@ZT=x$uR>;Ut 7DDu#:fd onܘ|1 /gHsʕdr6`[d8odmFh+ymm0\ HBvk  څ$]akft[h~ p+5ңH)^H7o`b.I+|i+CB-/NVWw8C<\`uU@f@fA ^4J|F E@pJ.߬X6Kf( l tԁXe Kk"Z`8=v1Y@[(:nw`N.`O1tt_6RVU kگ:`{mō ,(C5An^Cuжڤg؞@`O4weAVIZٹ id"#`w0vUS6z]w2|@f~[V\~ԗЃk ;hxgFKoib(êw1C_7]ImHvW2mudS@yZe0Ł2x\9VqpHNH9G|O_\IENDB` Node-path: trunk/prototype/data/images/door_closed.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2790 Text-content-md5: 8b4d5bc01bb71ea38a5d2ccd26f8969c Content-length: 2800 PROPS-END PNG  IHDRX:wnWgAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~]}bKGDH oFFsuG pHYs  ~tIME 9 YtGIDATx՘OO|j#5iXKL+)K *A !M mN x/}f88&LNHޏGX=y?FF8LzBA {6 3pE~sx>_өժ:rBT:ǣ~PF1 h5555\\ |.wzHX,|R 㛛 TxhhqeĊS(drss]]CJܿ?:ZS'z+W^EDi]Y۷l751LfwXR?f?zT_?4rpX,ssFH"( \6U#(XT*X A0p2˗WV셅gceekaydGG~mv{8|g6+vu1.W:I$--Uvj x䤹xÒI e2*"P(QOh.BA\?[[[0a4˅7qOfYzS\͛BD"P> yV.w:n&')1.$Rm32yh(a ٬\^_d2@6{qM2i6K*"Mf'w#0,O&^YHBөфBL l6/q{{ Rt.71`|y$ T D޽ҫVk &\.x<*.9ӗ.xaxr}ۍFjtbF'~FѧO[Z `Dnw{sҥyDQAz'Oޑ29r1|b@(흚 ,XaJ_s뫪HH5N!x:,U2XׯV8Jo޴Zu:+^o0xrV+JJGYl>;srMNU>1A‚r~&sq͢Z-KbryǓ͆ g+<8@RZD(D@ŧMMd{>N' $lpVQZ1>hF.W$ɔJ=zJtO D9}~m U2Gss~$|-5Re gg_~fO<;۝rh($V@P 돏 y@BT J>SOBL`|LEd'Ӊ7XZlᕕᥥ`E=Shi`QARø\*|bDϑ~?wB|6HVfs2^S0gii}}kku?֔J?>ư@Yy''s@?W?Ǐ'LLw:@ODjB8OO747d Jmkkoc0nݺ}DZZ ғ@v XOpG_͛DpBhZ-dB}BD r{OF;;,/|P_}A"˗~{@OOWWGG{{[>3sVowxmIENDB` Node-path: trunk/prototype/data/images/door_opened.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6014 Text-content-md5: 3178ec3331ed9cb6f1cbfdb2df0d49ff Content-length: 6024 PROPS-END PNG  IHDRX: 2gAMA abKGD oFFsuG pHYs  ~tIME 5-b&IDATxrՅq'ԭ%w;rUǯwxA RI*[V@Gە EkΑ?AQ;|,뺮~e۶m,nzXeUUUU5M4GU_J~vMǺy]]EQGfi1 ò,˲lzi$I??puuuuuuo۶mYy{ Gu˲vr̲*6M3ϣшgOi0 4{?@a>_\\|着2iҺ#ock&u}4 ú5Mc-ڲ$I~gam?==χÁ4 -fcYVǣш(Bpj([!@ضzEQ4MYyKL_m6Mc۶BӴxv`02ZUU' xkIE1 t:Nq0 4L&Tf).a]k...nnnd=D]ׇp8iiQEQS&yw#0$Iʲ<vw{4M4<۶Y6PE6Kb+ ,}ݧzT=#.ǣ8Fn2I8β N@(4f0 0v}۶̲814ɴ@Sx|>'{eYYjypfEi u]p8 zGm[۶GQYlCQyWU^RǏժ( ˲q~o(eYR0Ͽ˲ ]׷m( 88l6Ana$p۶fلanȷmq|yr<#1n嗻pG83L}4A] (nWeYapniƺ7oް,qb4M2YӴ^8<G)yMD) |Ȁo0O?eYeY&"qlC]yqrT% $I^纮i@^~_.m[}X4秮kuy_43 &fyzz4-IHz<MӜL&(8 PUHl&I~%RH=0n"I UUhEQrX,|7VA0M<؎ %MSɞf3’=m[Uժ#\<ǏiZtIbR #w>ci* EP24d2*I,ymQ)r8ʲ$#l6vayn6(|Β`>(P*H H:kF \'뺺(h%yo6(=[Bjf3tjrZN@~Ņq8q *' _iyPTi,\(>Iq%}Y,5( ~8{8....//WCeYL4\۲,x<&;E a*s@|9)#@xlc$͆@?D54 z1c}rGUU$muвbqOQ6Dm{7~ףitrF#̴d=u]e)(0 Z@z6HijGT6@۶f!jfm۠U8iK]޾}+ina`}E,KR_04?h2,P XS i @%.p ]eˌY%_.ܤiy|nFEo߾eSjЍz=DE#e:J{<0TU}_C1Ф!(/)+&|fDHʻ4A0xr]bvquyyt\&~[ 0+x(4Z lE] 0p8hn$Yi^A'}EUU4$0Ʋ,n{:z۶1݇mۖeY IqES,iҐY @'ɄHKZm|P tEV)!z{>BYylb8MS\F \FhϧRȎl6߽{We~ [1 sQA@A 6+RxKzc=??vjEs\.]8꺎essCA\~ SO"LLm[i#i۶ ݻwAPR")r a&gp!# *aT~}߿@=ĵeYY]XJpSeeٷ~+mѩj#HE!{;NŧOX4 :)hAr0 aa1^g΂ 4b2oHt@I|lm>Xʌvjs(...NUvKqL&_}aҰ:,Uzkt{{{{{+^FwX{SWUM3i8rvn̈=)U>쭰:+3p;R*e1Jg¾:B/K5ȫj[Φ8Ԑ ly LRɘ.%O*y`eYv5R}8yTJGaRMIbc6TlW5 8txi&_ps=,l~eYa)BEqO("{Ca<گ 7U燑boݠ܈~eDq"*x (WC] $&飄e{Iat%_Sl ԻD“.qnR Keǘm7EΟKhgC>VLa3Y<WgJ\z`Y9S84=6ᷜk&Y%ҍ1Ф8Br:wn+\ bvn5? eXduaYFhۖe ;?tu.p 8_2n??h&$yޜ m]%+_#uscN:ή p''^Vǡ3.lM|Wn+*+Οt+9d2.5 .^b̲,',,˲ӻ_C!rASq\=EG wmi14EQ( #28a3ZbeA]f(: Gx\'r,O8B(1 za4%Eke)qb煳@9g FE߿YSE2<xyy!lYeÇ8j&w-y0y(ST>/!@ܛ~+"CA + J@758>$!غAm' |b7?PȋMЩ bw$TYB蚲,I_Vԍ.U(r.-*u\֨g9Ϋ^S8E.t;F?>>>>>rT&qx8u5 RNȩi9}%O9]!%iZA Եm+Wڶe7 Kbbn۫7oް p=o? U&tz%MlۖK57_IENDB` Node-path: trunk/prototype/data/images/font.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6750 Text-content-md5: de7305e0bff6532e017ac89ddf562860 Content-length: 6760 PROPS-END PNG  IHDRg .PgAMA abKGD pHYs  ~tIME ,GdIDATx};v#9{еƽ ɴgIoO^ly$Zb˽o@7 QY$$? stڒ?<(U>>sn}}I}gKOH#7}d;FwU/K{8QKi:\e>TmK^}~.cWWH#})X9$Wdp:^vB[RN.z}] Wv}7ɖ5CX(aaEҟ5rCdket:=6ާ7SZ?/o-v-_"7hg::}lm;LB.~>uDX.Sl>y}uÃy0b782+/~-@iۮ ٮr |,nbiܓYH)P\p5dد {AbT~X) 0ѧgZ̠:-i0ʹE5B]w0>f,~'אi, ƃ$KC\J=~ɦ8u(K^泆LmW5}uu4}G>){0{`]0Zgkt-n.n|e,D x)v*@n>X`2k x 5nX|xcYax\<?Vɮ1lsxhtr- C_En| :fZ//x4'!ps|2}T{/SΗZk M2>έ6 wS|D/.ӂ3<рS sKZ j@cGgn~?kaY:g_y'^íe5vip#@a4ɿ\Yhʻyr9#\B'p}-͙`~e.*| 3;%Yr<ّ->y]}N0/~ǎG*sԷSzO~_==္8m0v\yݞPTFK<`O~O~vԳ|$?!a1^u <ܞ܆s'٘+c Kp|lM?7][RŶB,Uja b }yRb&=xut _:76bW<`אgC:x ,|hgvx-O~hK^Oxܙ`'X /Vk٫S~sC?36'?ܚw6_C; my0ls&>Ty¿P})xtj !l!l6a[X?`Ȏd_k'D\Z{-pr:9 Z7raˑ/-r :-cnr=?DkF͂r.2v<߿YVFNYMv,sUgpVz'mx³XjW&5b{hk%6?ʁiOO]_/a `k4₿?-v-v[3N/rcx$t5XcW.E< Ƿ܉Хa^=pE|p|4x2&&鸃ӻ~l7?̼/lo *Hyt]$KA'$NM{o_Rvr1ܕxĮkw~+ZWuLb9 $)i>"W.N;/Lr_ߴwUzĄ>ٖ(ĿV>_rpUD#У "l6~)qcag)v%n>}q~Lcpi 3 !3VMؼ{t&vM)c毜'^7hl) 9fjupi?۱j>͌9){_ ݉H_Yx~[<}b[S9%}̞R$K3F@l9YN Gcmye~$M6bAֆ6XK%g}WZm!ǘk?ذbk"=\5>63ע}pǾ+$߄$Z/OHW}6BxFwm v Q`h͸9\qd3s57aWR5翃~%r@tw_|ë?:1OS[!O䑡yY&&rz%u[2DSK=^#ѧn K4:ՕL6hg5^n>^tK,J}orWao!G.\߼&MxW\9V #Iiut{>qqk-n>P8x1?oW4>gv{&uZL?1=) 7>A68c ]M#j.t|JӁٸOps*B}̰dz0vwy~'PL_'JǍa+bʊӽa#S>jV-Nj=^qm(̞rtbaTB]MG7%u<.7kT6to)SG|O`=&y93 [P n #G'}-,gqﳜ";8ߔ 7VUٝQ#~cX_.gѹfW7g >־lEʠ sK;AHrwʼOV>O_v,kþ/a|H ߏNĸ6x1.ϻx7&~N?qp80cg_%Y-K򍾜myؙ =5Ɛ?^ÏlܓR1nXÅ%Fr{.M o_:^3im&.:Lx2TgMqayk^Ll"l$"iX ?qI`8H5ۥ>Nؑ *CÈJW97hްmomRGtZC{4#p7le ~>n56n%|[aL+1S^;P8^/7?f^/iDx6l#)DYx?mؤI.a*IjϦo|֢f$=k9azׂiz1s_)'á1/!֢7F=6Yƒ+uZcp?+^dBdZWXs(VqźPӯB?rC|>f/+(Y4eo=j֫-~n9%DMls _p \4'>] rY$TO}rivz}dKƽvXO5dY& v*Qw}țuYg>ko#w5=u#{P 1o}C/W ߆ϴ?>] BaЗ5շ_[?=9طtߓO Q=7c6Gl<Jnys!ǥ۴ֱޕ1A S}[ɹQQ]2{Xb]Pl׎1{I#.g󓀿ib{ӏYK) Kd Vݻ84|3}218n pԂ"ӵcfM&a:'I>7oL(8v+a唢Wz9HiYuvM:vAi\%?zEoM#jwt6}K~KrGJm,-I>5%->fwRl$tbFv8WD.~G-gu_w Hq1B9R =uGM_GXgߜrcy%r)KlO$qq~)c|Li7YkYvs>jX=1׆5F0.y/9)!`j,3 vc^Y7W^yۖ}Ģ1ܞG?vm6~ jg(05/d[rzr0dc@'K9K Ehı3Ɲɲ)WBWyR\?m>f/@ZaD:-*㸑55ɕQUb3}b'K# zQSz1U-~-QxA5Zl296>ۀg{^c[ -鶩G͜F}}h XHؚ~0WWfQ[ ҭ] k3^Kq=ߜZZyive4'TO &HNߜ n=h:nX9n-:؜NJ$Go ߀rESRyuk߶- ڱLLMZI_.C<0h3 u%}K\A%ڽ&aT}t__s}>6//yA/>zIוǾRl/a'`-¼ls: @܏l5?E/5'7>eC? ~./Gg{KW)el\+7FzKQ>n:Y/%NsKr9 6FƆ\O,:4adZbb6᫾%n ?knĝ #Ϲ0yL]4ɗ_5}Ԝ8֎c`>6Q$uʹ},Ϳt m_S{I|un!c5C{r2w-;[E|+/N*6kr,cb-(Dkㆥ?PF:< ?yXVg>ӟ{bek|(\Ż4^!Ծ.y-X6Zkq5qxY7l1hHt[uk!0+=٨_c?elt=>Dz)AC-\J55纁eiK|{+oa K{Xpnթaso%IW!UaznK}T͙ᛂ_o#lX]asyChFi$]jaG#^ z$vG~͸>GnfXodރ&H#4H#4H#N78Hԏ?^x"<7g>?Iz4H#4H#4H!(=>( x'a<Ѹ9FiFiFiOAңLM>ⱍp{@4ts{Щh>ZFiFiFiċZ}DjLH˚IENDB` Node-path: trunk/prototype/data/images/lmogli_back.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2111 Text-content-md5: f38bc9bd172d5a4a08416e6bd11f5e4b Content-length: 2121 PROPS-END PNG  IHDRVpgAMA aPLTE333 &f&DDDTTTvvv[[[bbbrrrlll7w7>}>yyyJJJ}}}jjjCCCNNN;;;@@@4t4eeeiii\\\|||**;;QQQHHHfffPPP777RRRVVVXXX___;{;""cT.tRNS@fbKGDH pHYs  ~tIME  Ҿ$IDATx휋v8 1@7RhIg3ݝmٱ"fNgHȲf6\lدBl ,X0ZTSty@agk kLPr5QvӠ ɣQci О2Tns c:sP2j4r "9vU!O3hr3hrLz@˄=7W5~ˡW5X :o\ϗ;Y5!BNr`Ělx ;s"CXKBXW[zG\MHUvP1ПWw2F0ueM,Ns,hMU'J%j{g_[D.0پ*d&XoaNȄjhv R KD|vr,%C/R|7sbԧTC);RՄԐc;(>f>'m oGJ6ơ-E qTqPM uͅ>k4M+P%)sJ\qlRMFʚebD^CHtܲ[+F^M[B8?C qkvH_T!pt }K]T/Ԁ <(\(ZUxMC(TmL AW|%\CXzF_+  uFZfAlZI2 xg9zw|f1[LFunޕVwVB+BHZ  ::S.}]_Mjbz?" z:W;ѡfS{4P?J0Oue@гW?AU94j&,1UaQ/A^DE`}T*5~NN * TaKVQC2[щYD5F[w{5 _:{"\9{;aƥ!ا2o+&yОZcCx vȞ+{ lQᎤTk7Kc"xPvc 9Ɓ>{U@Վ@*aY¦&#$2QȞqa~e 2~j=*o8i:#AsOHmQ4Ci4z7)>ʻ(ҧiszbTG-JѴ*'3V`["ݳ34.Gŵ AW>+avxG=s,~8HՒw.S_c}@_;%~_RWn3Ko3ShYJ5ٿB>2.rUbfF'@(gOSm 2PIENDB` Node-path: trunk/prototype/data/images/lmogli_front.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1026 Text-content-md5: c32ec8f88775776d5a4bcd3526275e6d Content-length: 1036 PROPS-END PNG  IHDRV{_gAMA aPLTE333vvvCCCiiiZItRNS@fbKGDH pHYs  @AtIME  $YIDATxѣ0 ݂Zp ++pj19<`Hkp@"$PŐnVEM(:6W (q)pfPYl[N5A`&p9v&empML\!*@ ,9Қ@q|,2\&.X# ċ:7Wx@E\YU.p;]<-Ŷ܌[W6MZr=Ti3Mf],p@[1O# Ǎ*-Pɂ I{&LN^0;|:ò ڼ!K3F $$$t6RטxMLG:xu>㒬H{ @I@o~Mq8iwȪ O+Jp僮2qh@R/a@oѮƴ>8ܔ@maUE; Y &xcWVSc x9Pknt&&Ч;.)uMMYH. P9Ċt7{3i7Laƪ TOVVhRK5p@E`K?Ј5sSv5[Nc+ЁC p|4yT\[_rN@ ]q|1Ժ0 l6$E'm rX=)hQ)F$GQDK#qhl̮LDzLQG:M,v1 Rz7D޺ g8??߿÷oߊJ'uNѶ(SѲNǢ!q E%#A,=u{ ^&xu52E-d?dH6^Ϭ_k,6fd,èdI\u=^0ENgT\++>1j`}8E], P0dU^\(%r,bQIsxQXrԐ][7ᘒNu&s,8k !LI'Xy,8 ...޾xx yjl6e(u,{*s2G̢~I d]'˺X=9h]f5:Zj}mm?%XŲhѱ_(Zt.5dVtjGem ò.eOEUd B?~vl"0 %(Z)<SqJ u&eZ)1Au۽k4rׇ)<SqJ u&HDҠb:ZTǵTVT#Դ--] SN'eLâ Z) ȭM^)j)ɊZPӶzoL8pVVPRK 6%:D"F߇ϴ5(R]ݸ/l'HwݞL8~qbh![o" E_wN:hp܌;I{%Gٖv2m6xµ[H6S7~#IiةQVQP&/ŧeQGu/4k[dOŲkkZusuI!o MYpo5.E͗p(nVYGUZt 'S?.7>}#q6cl* _fw,%W7-\\N(Օʔ'5 \ݒi0@B;̟>}]=)X,&[jS࿨{RnisqqͤfrvҶ5q ެe<@.4"k LB8pwwFK _tL|(>uۚpxL7= pߓTYkӤr_:%ec;D!bQ\?hckϰZގu4P:%4e4#f[eecn4M* d9C3VNuM@kUzZeĺHtmA٬hU5=,d2a_-tO:5V{hYÑ:A,r֚V@Vq w^ҙa{F3nZ39TBU cU ߗV>){,QYOl~>o,w*4nY͍e%bOrQ q#c+TreM ʬz;Fk_~5wm9Z"Vll Vt/Aa߿\ \nVbmRYՓ$KfYo-Em6ݮVjXXMjA98TZ#֣`K1j?*iVN%) >]lB޺=r*՛ZǷVg?]M<~^,Dė~* _qY)=}-\J3/#|ڶGJ꧟''¿O9?$z?zCsn2 [}K WLނfUT4C?ܽqGn ;q< xYJP徯HE4V S|R*P{Zh132~cfº3bcH|>ZkVnv.H7f)[G> !کN5g1T)@Jecֶ:5uH|:Qڶ%|k97ssw}||:k\lH7EnY(ʎ2矦~?nBٞ$.DԘejmhpDCFg'xzz:ׯoܗeCڧvȫ@i2[=A(j26S,rLf83 w26^^^`߿Ш̜ /ncs-:z IZCZzZi}Vcpg&wvh ]h95:{]^Ī**ZC 7󈋶V}Y*=5*(!@ԁgc2XW=\3s:! ɔ{MeE{T @Gh.Kup+!'3G!A!I$5>-i9_!gʢ. kG ɔ{M'+}_[%E[)|UƝ*%1@zKwdT?vԺHHԝsf|{]k!VVIL!huݲi%$r<]%T?1Rv?1]rvK5sw%hJ笧T>twN>]Bi\&_cSN;Lt֨e8]ݱ[*CLV$>{\?5jNnw?S&ZJHK$ [ 7heLGi͙%GF%֬ɹ{NМYCBg*Y*K:YHHy4 p%uܪK͘w>n򱤓tG^em:%eܪ]; I=,)U :IB,UoX-s*96:q4̆O*nH읜-gFOr:W7;\Y`zŪ eN%Nuqfq^dPt=AH#<Ш^ :||Ѫ.$m7|]]]%/ԕӁJe ]j():5ĝAeLJ(6q Ნ`ߵ[* IEsBzko$fNѾk7nK6*Uۂ~B3v-&7KvB֪mA71)δؤ64E~)hRZhoGeha.:-.6W))Uڎ!,LѪÜ 5H-mnMi;ij}X"sZm,7BU6 7#aQfkLjj~ a4dܵgi12 Ԗu @q[1Xyn),a^}m]8,erE?XZ.Y/m L)Y.z/#%fvOS'66x;?m9=YGK#mv q~:D x L`imvMM:ehĐno2);sQS.k3e擖g jdu]ՐK⚴"92Gm+nlڛrI]vU 5`M?EMjUzMZM>Գ% *2ݹ,PCqڃ0vwݲ?G>S(-R3b(ݗܐPVTzZY6Eh zC?@K3g$enc4<'׹}>K U$?.sxj-AKF4flfΔRkP?%)Ϙ^&Yj >LP|UzoYXXXXX&1RJIENDB` Node-path: trunk/prototype/data/images/lmogli_right.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2829 Text-content-md5: 405782a13a79358cd1e961a05292da2b Content-length: 2839 PROPS-END PNG  IHDRVTgAMA a9PLTE333JJJbbbyyyRRREEENNNXXXiii@@@\\\fffjjjWWWqqq$tRNS@fbKGDH pHYs  d_tIME  Mr =IDATx]b( &u6{c4#>RX$ɝN׿kkȗ嶃!y<|0oCy9ʿx+>;m\˻>g ćgǯky׷`9-c2yA8`cNn|xp?|f|vn yٽ2x<|Ǹp;m#vsƅ+Gqswxٿw/UCiXkG b#/n Sb1sZgv+@]aӚҿ@]trzcݨ\i ɖ?@ډsV>9AtbB*$ah}Ϟ4|j;-oW1uOs Ydruhxmϟ=o$c! ]y_v!HXw|ھ^ JEkb̡ Iw[Q&)1ݧ[*Z gD))\w0 gF -"O|~|y:+dzs4Dts.G=f1:(*mCK^>g٧M sܐ[8<@|*tP %uN]g[~S<1M31:(8:Y(SV Qua">g3SθmT/J3vP GTI9>nfN)([A9 B#4BhW V"d~Nl_ mBhHjx~ ah5Sִ^j-]%9ϐ识7DW&"sQ4Oqƫ~kF/;b2\pCEQz TE1Og+#ng ٕNKݰR?Q5|63B,Ba-^09hRfFPP w۔'&d01s&|eOchSkJEܷ?szy򾐆=/gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH pHYs  d_tIME  96`YIDATxYс )a:3 8s=%"v&g;`lHL8B r9X dX Pb Zmj2҂XM 2)8}t\` !#'Y@15(iՒipv⌻܎6<gֈ\|e;XDm1p!c /Sǟql^)@khs$N']DgdqT >>[[[mmm~~~SSSdddJJJ %%%ſIIIĴbbb???###!!!222{{{---(((777 vvvooolllzzzsss===qqqAAA___cccyyy񈈈iiieeejjjVVVrrrGGG```UUUKKKl qtRNS@fbKGDH pHYs  #utIME ;gS VIDATxmXE*(E 3Qk '9 iiȠR*˦VLb&V% -ͷssumӓs10x CC(wVo7"ķE4,lǎ_$ʪ#ݹi׮')nn"<|Æ>zyEDPotϞ?$:}͚_'X2 `0'{Y,6{߾> @<=ccEF8~ڵ >vH ֭31IJ[#G`0*un;I ѣ))oBsj*;fc;RtiiǏs<^z3xx,vժ?' P@ 8qdFT.&gJe0J6wv۹z841N F"A"<(.@KJ@ -}H*BE"ZPT**͍J" *3"/߿LNëBCp%!p||j77>?+Knja0{zz{R?///mmE,۵YBahJCBP4X(; ~RUАdӧ|>ՒH4ZN34>$(*|}_XOzz[LF67 ̥HѠiiAABX)TWڦ64 GEUVge-T04pDt`@麻tryF07?8߿?<@,+{BbTomJZmn%Y,N$ӃǏ>.7vZ8ǎ5rVSdR0ѡH$ VW_*x^A-riB!E/^)T*Fŋ =}}iiHdQQj*5J*j5`p8==CC]]!!湹CCh4Ӂ&S` qz\]ч$%Ξ<9;;=HHC$h,tJ ڼst\ddH$66w>maQ]K) 33+92n|\&?JdvuPჂX6K$RAfg~ұc11W#'DbDla -ꂂt ]]0ehhaqL*UyUҿm 8oIENDB` Node-path: trunk/prototype/data/images/takeme.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1823 Text-content-md5: 0f4876ee684ad52d4743e08ee2ee3ccb Content-length: 1833 PROPS-END PNG  IHDR($Q}rLRa~~vM^sv{KT*EP H$,\.뺸K`uu 666jj5.\KxxPuE!ȻOVcvv41ML&8yrxxH^ bTl6vq]mGh]u]r*+Su0DvpH>vR)Μ9C>'i6mBB84I2bdRJL4#q jF#Vrv]&Ad~*(ia6eaYX,F<g2ytEQB033D"q"J+WH @UUfggT*\ZZ:V3-ˢP(h4h4xwLZIF7cXH$aT*._뺌F# 0;;KT޽{X,@>Ƕm8z="R b0:r2BtZ:fYqpp@a<cYH2/^zR(8{,nn˗/_ؐO }Y\\SڒDd N(TU}2*gϞennEQL&i,˒)ux<`0`48NrL>'a&h.K,mc6iH$J%L(q2^^GZZxG^u]> UUB.`. Lb|EQ !l6B,,,yv^G%Rx!!HO~q98;;+ÿ*#9)a(Sd&eQ*( a۶Ի0 t:t]!Wm'ZbHXd4GzDBOKu0d<8iRVO& ]FXDAammVrWNDt:Y⦵ll6q]xd2A!ܹsy)S@v3aH$xO O6 cQ8p8H{~wwBW5tN˗/g<^.woӑBljbj57ӒG&|۷?3ɍ7B۶byo{p(b>>TTTRRRttt]]]cccooojjjǪHHHiiigggUUUeeeJJJlllkkkhhhbbbdddۺՃOOO{{{Ҳppp[[[rrryyywwwnnnzzz|||VVVWWWfffvvvYYYXXX```˿ZZZ^^^aaaܐȅxxx~~~qqq‡}}}===uuu\\\???___CCC黻DDD跷BBBGGG@@@III<<<;;;AAA999666777888mmm555sss444:::---***111///...)))(((000333''',,,222_4tRNS@fbKGDH pHYs  #utIME r IDATx[w+TT FXFF{L^KڴM;93ϝxMձyPRs''gg"q8|lIH$ӹH@{Gr3ݽ[Pb E]  KK;:{:;""nݪ?==>hih lo %^9a\bJLF$ 2Y_@ ãw`)0yyͥ<\N F0JUW18Axxn.74ayyVxFQQ@GZ-.z`$' *ȈZMUVvtL]]fsrrę"#? >@yX7:J_ϑ 2D}`tTh\\ܒL&?3ݺ566>^^xI1+F;9pnnSS~~drwwƙ맧?@ /zȆqT]dVWtH$'z{ H33cgOdJf0.z`ϫδWYu"!Pdg75=yB<}tbZf_Xj%) n˝7o65w @R\ϑ 2auyL&n2H󩩹>>|~[݅AA<K.z`Xf$yz>Mii E0.윝5!!ë[Zڵ5/SS<~"3]J/zMWRL=$()) --ݾ]SS_ݝ| ,^@"++CBi!//@jm][P_PQS`s%1mGvv(Ojk --w/:;*jqhL jj {͛ \y $X/_ CC>>99>> ӧYYAA}PPCCSպsѫ0. V:kdV+` 꼼W}}90p~WTχ}EuE0X]"4T(0.N, ߼aJ`I(v^vˍ9?9IL ''?NK陞V( d285R9:^4U88C T*r::扉"/aHKkk HK˗6 ut}/5zz",FKLa:}YiiHdo$@^T*Y,,8((:6?Bp/^64`0ht_URíHgpҁ>׷$p4? JK3.}E0D%vpj]_ XBBBB\\FG[[Ԡ _۷}}]\7 Á7.@޶a1LB"Y]h;;].W X]5$/@' jeekgz𠬬<6 秧/.;;s86@hx< 2)a__~qQQccEţGyz33-.CeMyݻbݻϟ׷̀MUW!$Dy&;;C5R1[Z M>|qNSSkk͍_ᴴZ,V LmCc0P(_vt89KK))R>>JFOMͭ[kkPD+/ hVV0<~tԆ`H$ss J%V1}ap`fT|fLLt3Hϴ85uL R(|}dxo a0fh6V^~>49A֒ɷoaB80W99\Z:8JmT^^z}Rmp`0 >NW׎?6߾-(~ v,>?+ '`3Q[Y d/Mi@r&NRC5cb_J<ܤR5rh{fr;Z[a}C,~dbbnnf~Da\&*&snnbbppo OL<:7_~ySX.,hՑCCNKKԙI$)MOóOODD-/9iu|"T.}|dDEi(o4NOXomn++hZ᜜,/{yi42gTOW׽{7oQ(p aWW۝m CUU{{L]vJ#1*L^\bs|<1ꚜL --..QQeeCW rWVvvT*0d6-;;moxaACZZܶE" kg>''/[?"D֙`XX,))ZLM{/ZL&82nøHLJe :]=>^]5H->5=ؘHJZY7ZU5;ONBykXZc#grq))$vvUmˆqFG`OHRގ>HHFF=grp(.^BZH$ɤ՚LrlL _};9{zdPwAA6%\hB\^\, ᄆXSS==qqׯeeCOϚADJGܙ '4LMNjwwWɤ۷n bbNOC/,0ΓdBD`I&So4uw sgbc[[F WWjnN98@ 0к:bb *xx@&ږԺ: mo_]Hp8ƕ@]]h&$"*U ?/.6 P^HTzr8,lpN/+Mmzz~^&c2CB='f Z,BS{;fWVwvnlxx,,Ï%,LʂCw@%%MLLeeO8:0:d'.D"SYmQQSSc#wrdBB.,qgІWi4*DB:DFzyxymn.,xO CM>lno7oBB$Re28 Ӫ1ڞ91c3MOCUH~ܜZYjoM`ɉ |s Ʒr¥%ϷaT  w㓓ΩǏ_((} ,yYYyy{`_h  XU% &@\S67BC]]5.]_]a\S\X`~L;8DDhﶵj23KQ΀Exyyc#/O1kow8@loMh }2oo 9;c0 猈+ՅBtCq1卍[[ 0'O>浵3qׯhL$Rl-<|mb40>@'1㺺:=!DNhpofsl,>~l&{ )S19l>:\]KJ꒓;:RS**>S+9Y,.+霜Hk0.xh4*4TBKK]嵸qOG=SP0>G(b0șhp8ryX@m (鎎2Y hoG"OOCBJK[[(jgw?$lvu!bb||bc{z>*e>d~'~-K$"RVKryWxEn݂@yMH8WL?9t J0vt$%i`d͍OI33kk⚚76h4'_T18緹 nQóNO'%q8{{]FYv GGCC1)rLo޽[QejR(WVFF\I&rs Һ: ͍vv޽stlob8:ZP<<3A"xz&'//://"訸xpP(_ $HdH$*Ŏ))?YvO!JvN30.F_4"==x4 z{r緸bc˧L&kޯbU )4T$o}ϔaSSEBt/_g3+TnoC.ҔGGHqT CCp &?( *kj<}1{xD"BI.((X[bdTT@mNN ,voh$RJJWIddNNdgݸ10EaavvNYwq`qvj'& +Ƿnnt mk̜OJX˽p%0޼Re,NH8:2NNz{y>+*7㓒@0H$ 1UZA @0ի"3s`@$JIaxx~ΔӅ<98cc));0 jǸ\<}!@R)o0,,LN"WSCCJ/\[s):چOA`G7EkjIrxPݾ.lf3OONFF`HRpϞeg}IxxCG`8I&ml3攵tv޹ {z*5V+hέ[n6wtX/7]\NNl.hgV@F #mntmh~uQ{{ *LrHj}y~L T=}3? ~K|a0PN۾o򆆍~}嶶ՊǣNtw9TTj6LёP66O{z~+ *D d047xQQ㵵_}UT `${p`08éTtJDtPɟۛ|&%5"÷-&f|߿$!g6˄qx0EvϣR95ї_]]nn ܾ?Bpϟ ..3$gMh(B!⢧h_qm-$U(G."jCCKK G~ Fu5 .nog0(GGB!QHY6== b4PTVKK++?`X,WK$GFȗ/e2:‡Kaavgb[[;;3'&dIɤRMKf?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); // EOF // Node-path: trunk/prototype/guile Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 4536 Text-content-md5: 43994d69c6f6fe789c5db2881fd377a7 Content-length: 4572 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (ice-9 syncase) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (println "look object - and here what you see.")) (else (println "Can't help you with " (car args))))) (else (println "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) ;; (println "LookAt: " args) (cond ((equal? (length args) 1) ;; (println "Object is a: " (get-obj (car args))) (look (get-obj (car args)))) (else (println "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (println "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (println "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (println "Don't know what you mean.")) )) (define-method walk ((obj )) (println "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (println "I am already there.")) (define-method gopen ((obj )) (println "Don't know what you mean.")) (define-method gopen ((obj )) (println "I can't open this ")); (name obj))) (define-method gclose ((obj )) (println "Don't know what you mean.")) (define-method gclose ((obj )) (println "I can't close this " (name obj))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (println "You picked up a " (name obj))) (else (println "You already have this " (name obj))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (println "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (println) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (println "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (println "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/dialog.scm Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 1407 Text-content-md5: 6e0e3e2c1f73d7da455954b35cc29870 Content-length: 1443 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -e main -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (ice-9 syncase) (oop goops)) (define-class () (dialog #:init-value '() #:accessor dialog #:init-keyword #:dialog) (register #:init-value '() #:accessor register #:init-keyword #:register) (func #:init-value (lambda () (println "Func unset")) #:accessor func #:init-keyword #:func)) (define-method select-dialog ((obj )) ((func obj))) (define-method show-dialog ((obj )) (for-each println (dialog obj))) ;; (println "show-dialog--")) (define *general-topic* (make #:dialog (list "Hallo, wie gehts?" "Wie ist das Wetter heute?" "Einen schoenen Tag noch, ich habe wichtigeres zu tun.") #:func (lambda () (println "Bla selected")))) (define-class () (text #:init-value "[unset]" #:accessor text #:init-keyword #:text) (func #:init-value (lambda () (println "[unset]")) #:accessor func #:init-keyword #:func)) (define *current-topic* *general-topic*) (define (main args) (load "helper.scm") (println "Dialog V0.0") (let loop ((a 5)) (show-dialog *current-topic*) (select-dialog *current-topic*) )) ;;;;;;;;;;;;;;;;;;;;;;; ;; Topic ;; | ;; +-Sentence ;; | +-Topic ;; +-Sentence ;; | +-Topic ;; | +-Sentence ;; | +-Sentence ;; +-Sentence ;;;;;;;;;;;;;;;;;;;;;; ;; EOF ;; Node-path: trunk/prototype/guile/dialog2.scm Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 2846 Text-content-md5: 818d16d1ede2e3ee7f21653a359ce559 Content-length: 2882 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -e main -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (ice-9 syncase) (oop goops)) (define-class () (sentences #:accessor sentences #:init-keyword #:sentences #:init-value '())) (define-class () (text #:accessor text #:init-keyword #:text #:init-value "[unset]") (answer-func #:accessor answer #:init-keyword #:answer #:init-value "[unset]") (follow-func #:accessor follow-func #:init-keyword #:follow-func #:init-value #f) (follow-topic #:accessor follow-topic #:init-keyword #:follow-topic #:init-value #f)) (define gesundheit-dialog (make #:sentences (list (make #:text "Habe gehoert du hast dir das bein gebrochen." #:answer-func (lambda () (println "Yepp, ist aber wieder verheilt.")) #:follow-topic 'dialog) (make #:text "Habe gehoert du hast einen unfall mit dem Schlitten gehabt." #:answer "Hab mir dabei das Bein gebrochen." #:follow-topic 'dialog)))) (define wetter-dialog (make #:sentences (list (make #:text "Gestern hasts geregnet." #:answer "Jo, da waren ziemlich grosse Pfuetzen." #:follow-topic 'dialog) (make #:text "Wird wohl morgen wieder die Sonne scheinen?" #:answer "Ich glaub kaum, solch ein Glueck hat man nicht jeden Tag." #:follow-topic 'dialog)))) (define dialog (make #:sentences (list (make #:text "Hi, wie gehts?" #:answer "So weit ganz gut." #:follow-topic 'gesundheit-dialog) (make #:text "Wie ist das Wetter." #:answer "Die Sonne scheint." #:follow-topic 'wetter-dialog) (make #:text "Gibt nichts mehr zu sagen, tschuess." #:answer "Ok, bye." #:follow-func (lambda () (exit 0))) ))) (define-method show-sentence ((obj )) (println (text obj)) ) (define-method show-topic ((topic )) (nfor-each (lambda (num el) (print num ": ") (show-sentence el)) (sentences topic))) (define-method eval-topic ((topic ) (selection )) (let ((sent (list-ref (sentences topic) selection))) (println "< " (text sent)) (println "> " (answer sent)) (if (follow-func sent) ((follow-func sent))) ;; (println "Next Topic: " (eval (follow-topic sent))) (if (follow-topic sent) (show-dialog (eval (follow-topic sent))) (exit 0)) )) (define-method show-dialog ((topic )) (show-topic topic) (print "Question: ") (let ((selection (1- (read)))) (eval-topic topic selection) )) (define (main args) (load "helper.scm") (println "Dialog V0.0") (show-dialog dialog)) ;; EOF ;; Node-path: trunk/prototype/guile/helper.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 922 Text-content-md5: 626775ac6cae3a4d85df2af56c5b9205 Content-length: 932 PROPS-END (define (filter pred? objects) (let loop ((objs objects) (result '())) (cond ((null? objs) (reverse! result)) ((pred? (car objs)) (loop (cdr objs) (cons (car objs) result))) (else (loop (cdr objs) result))))) (define (grep rx strings) (let ((r (make-regexp rx))) (filter (lambda (x) (regexp-exec r x)) strings))) (define (print . str) (for-each (lambda (x) (display x)) str) (force-output) ) (define (println-sep . str) (for-each (lambda (x) (display "\"") (display x) (display "\"")) str) (newline)) (define (println . str) (apply print str) (newline)) (define (seq start end) (if (<= start end) (cons start (seq (1+ start) end)) '())) (define (nfor-each func lst) (define (nfor-each-helper num func lst) (cond ((not (null? lst)) (func num (car lst)) (nfor-each-helper (1+ num) func (cdr lst))))) (nfor-each-helper 1 func lst)) Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7183 Text-content-md5: 5b6dc70ec4f5118c89766da4e9dfa6d0 Content-length: 7193 PROPS-END (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define *before-house* (list (make ) (make ) (make ) (make ) (make ) (make ) (make ) (make ) )) (define *in-house* (list (make ) (make ) (make ) )) (define *forest* (list (make )) ) (define *gateway* (list (make ) ; (make #:adv:bind (advent:makeobj "takeme2" "takeme" 320 100 150)) (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)) )) (scenario:set *gateway*) ;; EOF ;; Node-path: trunk/prototype/guile/room.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 665 Text-content-md5: 410ef14cf9ee8ad0930fdb7690757505 Content-length: 675 PROPS-END ;; All classes need to be singletone (scene 'house (background "test.png") (colmap "test_col.png") (has (item 'indy 'controlable (image "indy.png") (item 'whip "whip.png")) (item 'chair (image "chair.png"))) (event ((collision 'indy 'chair) (locate 'indy 'outsite)) ((use 'indy 'chair) (locate 'indy (pos 'chair))))) (scene 'outsite (background "outsite.png") (colmap "outsite_col.png") (item 'indy) (event ((collision 'indy 'hole) (locate 'indy 'house)) )) (object (container) (contains 'treasure) (name ("Open chest")) Node-path: trunk/prototype/guile/singleton.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 299 Text-content-md5: fff2a7410a5f53f268055499e0b362aa Content-length: 309 PROPS-END (use-modules (ice-9 syncase) (oop goops)) (define-syntax define-singleton (syntax-rules () ((_ obj objclass super) (define-class objclass super) (define obj (make objclass)) ))) (define-class ()) (define-singleton box ()) ;; EOF ;; Node-path: trunk/prototype/install-sh Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 5598 Text-content-md5: 5afe8eb5573965dfb58378e4e46f3813 Content-length: 5634 K 14 svn:executable V 1 * PROPS-END #!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 Node-path: trunk/prototype/missing Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 6283 Text-content-md5: 393d298125f8e03c13364afe447b308d Content-length: 6319 K 14 svn:executable V 1 * PROPS-END #! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997 Free Software Foundation, Inc. # Franc,ois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing - GNU libit 0.0" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`configure.in'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 Node-path: trunk/prototype/mkinstalldirs Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 725 Text-content-md5: b4ef161959c2b46fc65943f062ca46d4 Content-length: 761 K 14 svn:executable V 1 * PROPS-END #! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2000/12/28 20:00:48 grumbel Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here Node-path: trunk/prototype/stamp-h.in Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 10 Text-content-md5: 1ded054093de910d9786c62bc4fe8cc6 Content-length: 20 PROPS-END timestamp Revision-number: 2 Prop-content-length: 143 Content-length: 143 K 7 svn:log V 41 Advent - A graphic adventure game engine K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-28T20:00:58.000000Z PROPS-END Node-path: branches Node-kind: dir Node-action: add Prop-content-length: 10 Content-length: 10 PROPS-END Node-path: branches/grumbel Node-kind: dir Node-action: add Node-copyfrom-rev: 1 Node-copyfrom-path: trunk Revision-number: 3 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-28T20:02:26.000000Z PROPS-END Node-path: trunk/prototype/autogen.sh Node-kind: file Node-action: add Prop-content-length: 36 Text-content-length: 51 Text-content-md5: 3990af7502227528e1b92ae2be3b6db0 Content-length: 87 K 14 svn:executable V 1 * PROPS-END aclocal autoheader automake --add-missing autoconf Revision-number: 4 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 55 Added the posibility to create new scenarios in guilel K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-29T10:08:16.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 3809 Text-content-md5: b0129e4e07a079e983982a2edd064a59 Content-length: 3809 // $Id: Advent.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" Advent app; Inventory inventory; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); Scenario::current->draw (); coin.draw (); font ("font")->print_left (0, 0, str); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/Advent.hh Node-kind: file Node-action: change Text-content-length: 1383 Text-content-md5: 1d046306cba6ad6ce34e61c350d7a7f4 Content-length: 1383 // $Id: Advent.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENT_HH #define ADVENT_HH #include #include "Inventory.hh" void inner_main (void* closure, int argc, char* argv[]); class Advent : public CL_ClanApplication { private: CL_ResourceManager* resource; public: Advent (); char* get_title (); CL_ResourceManager* get_resource () { return resource; } void inner_main (void* closure, int argc, char* argv[]); int main (int argc, char* argv[]); }; extern Inventory inventory; extern Advent app; #endif /* EOF */ Node-path: trunk/prototype/AdventObj.cc Node-kind: file Node-action: change Text-content-length: 3468 Text-content-md5: c98c75a0c7f2837bfc8052a3d7b1f785 Content-length: 3468 // $Id: AdventObj.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Scenario.hh" #include "Advent.hh" #include "AdventObj.hh" SurfaceAdvObj::SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos) : AdventObj (s) { sur = arg_sur; pos = arg_pos; } void SurfaceAdvObj::draw_world () { sur.put_screen (pos.x, pos.y); } Mogli::Mogli () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; delta = 4.0; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Mogli::on_button_press)); } Mogli::~Mogli () { } void Mogli::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { counter = 0; } } bool Mogli::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Mogli::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Mogli::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } bool Mogli::is_at (int x, int y) { if (pos.x - sur_left.get_width()/2 < x && pos.x + sur_left.get_width()/2 > x && pos.y > y && pos.y - sur_left.get_height () < y) { return true; } return false; } /* EOF */ Node-path: trunk/prototype/AdventObj.hh Node-kind: file Node-action: change Text-content-length: 2722 Text-content-md5: 505be8441839fc178dde64c34dca6aea Content-length: 2722 // $Id: AdventObj.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJ_HH #define ADVENTOBJ_HH #include #include "Position.hh" class Scenario; class AdventObj { protected: //Scenario* scenario; public: /// Empty default constructor AdventObj () {} AdventObj (Scenario* s) { //scenario = s; } /// Empty default destructor virtual ~AdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world () {} /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual bool is_at (int x, int y) { return false; } virtual std::string get_name () { return "-- unset --"; } virtual float get_z_pos () { return 0.0; } }; // Little helper class for sort() struct AdventObj_less : public binary_function { bool operator() (AdventObj* a, AdventObj* b) const { return a->get_z_pos () < b->get_z_pos (); } }; class SurfaceAdvObj : public AdventObj { private: CL_Vector pos; CL_Surface sur; public: SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos); ~SurfaceAdvObj () {} void draw_world (); float get_z_pos () { return pos.z; } }; class Mogli : public AdventObj { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; thSlot on_button_press_slot; CL_Vector direction; CL_Vector pos; CL_Vector target; float delta; public: Mogli (); ~Mogli (); bool on_target (); void update (); void draw_world (); void on_button_press(CL_InputDevice *device, const CL_Key &key); float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } }; #endif /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 3418 Text-content-md5: 6f433c61988de4a80f7be26cf0e7b24a Content-length: 3418 // $Id: AdventObjSmob.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; struct AdventObjP { GuileAdventObj* obj; }; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj", AdventObjSmob::make_obj); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; //AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); // delete obj; // do nothing return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::make_obj (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos) { std::cout << "AdventObjSmob: make_obj()" << std::endl; AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (0, SCM_CHARS(name), 1, CL_Surface (SCM_CHARS(surface), app.get_resource ()), CL_Vector (SCM_INUM(x_pos), SCM_INUM(y_pos), SCM_INUM(z_pos))); std::cout << "AdventObjSmob: Makeing object: " << obj << " "<< obj->obj << std::endl; //Scenario::current->add (obj->obj); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); if (advobj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); std::cout << "Pointer: " << advobj << " " << advobj->obj << std::endl; advobj->obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Background.cc Node-kind: file Node-action: change Text-content-length: 1154 Text-content-md5: a69fb271e2447e4db9be402f6e6cdeec Content-length: 1154 // $Id: Background.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Position.hh" #include "Background.hh" Background::Background (std::string name) { sur = CL_Surface (name.c_str (), app.get_resource ()); } Background::~Background () { } void Background::draw () { sur.put_screen (0,0); } /* EOF */ Node-path: trunk/prototype/Background.hh Node-kind: file Node-action: change Text-content-length: 1140 Text-content-md5: 71c288ced012696ea6a2198f4f13be18 Content-length: 1140 // $Id: Background.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef BACKGROUND_HH #define BACKGROUND_HH #include class Background { private: CL_Surface sur; public: Background (std::string); virtual ~Background (); virtual void draw (); virtual void update () {} }; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 3764 Text-content-md5: e838ca094800090d1e1436dcc5260669 Content-length: 3764 // $Id: Coin.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin () { visible = false; sur = CL_Surface ("coin", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; if (marked_obj) { std::cout << "Action on: " << marked_obj->get_name () << std::endl; if (key.x > x_pos - sur.get_width ()/2 && key.x < x_pos + sur.get_width ()/2 && key.y > y_pos - sur.get_height ()/2 && key.y < y_pos + sur.get_height ()/2) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; //gh_eval_str ("(advent:eval \"use whip\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; //gh_eval_str ("(advent:eval \"use whip box\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; //gh_eval_str ("(advent:eval \"pickup whip\")"); GuileAdventObj* obj = dynamic_cast(marked_obj); obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } } } } } /* EOF */ Node-path: trunk/prototype/Coin.hh Node-kind: file Node-action: change Text-content-length: 1357 Text-content-md5: 96fa5467bf45da068fac1f37e49c5bfe Content-length: 1357 // $Id: Coin.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COIN_HH #define COIN_HH #include #include "Scenario.hh" class Coin { private: thSlot on_button_press_slot; thSlot on_button_release_slot; CL_Surface sur; bool visible; int x_pos, y_pos; AdventObj* marked_obj; public: Coin (); ~Coin () {} void draw (); void update (); void on_button_press (CL_InputDevice *device, const CL_Key &key); void on_button_release (CL_InputDevice *device, const CL_Key &key); }; #endif /* EOF */ Node-path: trunk/prototype/CollisionMap.cc Node-kind: file Node-action: change Text-content-length: 1243 Text-content-md5: 890a581413e72b8d9455ee4dab9ee2ac Content-length: 1243 // $Id: CollisionMap.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "CollisionMap.hh" CollisionMap::CollisionMap (std::string colmap) { provider = CL_SurfaceProvider::load (colmap.c_str (), app.get_resource ()); provider->lock (); } CollisionMap::~CollisionMap () { provider->unlock (); } int CollisionMap::get_pixel (int x, int y) { return provider->get_pixel (x, y); } /* EOF */ Node-path: trunk/prototype/CollisionMap.hh Node-kind: file Node-action: change Text-content-length: 1139 Text-content-md5: 444848dafdb4d845bcd2dd77d5586096 Content-length: 1139 // $Id: CollisionMap.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COLLISIONMAP_HH #define COLLISIONMAP_HH class CollisionMap { private: CL_SurfaceProvider* provider; public: CollisionMap (std::string); virtual ~CollisionMap (); void update () {} int get_pixel (int x, int y); }; #endif /* EOF */ Node-path: trunk/prototype/Makefile.am Node-kind: file Node-action: change Text-content-length: 584 Text-content-md5: 4081d48e5db2bbebdc1b28972d2a33b5 Content-length: 584 bindir=$(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh \ Advent.hh Background.hh Font.hh Scenario.cc \ AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh \ AdventObj.hh Coin.hh GuileAdventObj.hh \ AdventObjSmob.cc CollisionMap.cc Inventory.cc \ AdventObjSmob.hh CollisionMap.hh Inventory.hh \ ScenarioSmob.hh ScenarioSmob.cc # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr \ data/images/*.png data/images/*.jpg # EOF # Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: change Text-content-length: 12624 Text-content-md5: 7f03abc98e95f045a2236f3c6e26a09c Content-length: 12624 # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh ScenarioSmob.hh ScenarioSmob.cc # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o \ ScenarioSmob.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best DEP_FILES = .deps/Advent.P .deps/AdventObj.P .deps/AdventObjSmob.P \ .deps/Background.P .deps/Coin.P .deps/CollisionMap.P .deps/Font.P \ .deps/GuileAdventObj.P .deps/Inventory.P .deps/Scenario.P \ .deps/ScenarioSmob.P SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp %.o: %.cc @echo '$(CXXCOMPILE) -c $<'; \ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.cc @echo '$(LTCXXCOMPILE) -c $<'; \ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-depend distclean-generic \ clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir mostlyclean-depend \ distclean-depend clean-depend maintainer-clean-depend info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3097 Text-content-md5: b4e042a39b62448a21aef3ce7fc7d191 Content-length: 3097 // $Id: Scenario.cc,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (new Mogli ()); } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } /* EOF */ Node-path: trunk/prototype/Scenario.hh Node-kind: file Node-action: change Text-content-length: 1766 Text-content-md5: 9848ceaf3a69d797d875d37005ef3286 Content-length: 1766 // $Id: Scenario.hh,v 1.2 2000/12/29 10:08:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIO_HH #define SCENARIO_HH #include "AdventObj.hh" #include "Background.hh" #include "CollisionMap.hh" #include class AdventObj; class Scenario { protected: std::list objects; Background* background; CollisionMap* colmap; std::string name; public: /// static std::list scenario_list; /// static Scenario* current; Scenario (std::string name, std::string background, std::string colmap, std::list objects); virtual ~Scenario (); static void set_current_scenario (std::string name); static void set_current_scenario (Scenario* scenario); virtual std::string get_name () { return name; } virtual void draw (); virtual void update (); virtual CollisionMap* get_colmap (); virtual AdventObj* get_object (int x, int y); virtual void add (AdventObj* obj); }; #endif /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 4834 Text-content-md5: 039dc117757f9415285a4c78b0580c5c Content-length: 4870 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (ice-9 syncase) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (println "look object - and here what you see.")) (else (println "Can't help you with " (car args))))) (else (println "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) ;; (println "LookAt: " args) (cond ((equal? (length args) 1) ;; (println "Object is a: " (get-obj (car args))) (look (get-obj (car args)))) (else (println "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (println "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (println "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (println "Don't know what you mean.")) )) (define-method walk ((obj )) (println "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (println "I am already there.")) (define-method gopen ((obj )) (println "Don't know what you mean.")) (define-method gopen ((obj )) (println "I can't open this ")); (name obj))) (define-method gclose ((obj )) (println "Don't know what you mean.")) (define-method gclose ((obj )) (println "I can't close this " (name obj))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (println "You picked up a " (name obj))) (else (println "You already have this " (name obj))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (println "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (println) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (println "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (println "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 7902 Text-content-md5: 307d41a93d3090bda54d67306d1a5f75 Content-length: 7902 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define *before-house* (list (make ) (make ) (make ) (make ) (make ) (make ) (make ) (make ) )) (define *in-house* (list (make ) (make ) (make ) )) (define *forest* (list (make )) ) (define *gateway* (list (make ) ; (make #:adv:bind (advent:makeobj "takeme2" "takeme" 320 100 150)) (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)) )) (println "Creating game-scenario:gateway-objects") (define game-scenario:gateway-objects (list (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)))) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) ;; EOF ;; Revision-number: 5 Prop-content-length: 123 Content-length: 123 K 7 svn:log V 21 Added a new scenario K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-29T10:14:22.000000Z PROPS-END Node-path: trunk/prototype/data/images/background2.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 53812 Text-content-md5: 80904d8239ec224b96f29438c89d2c98 Content-length: 53822 PROPS-END JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"C!1A"Qa2q#BR3br$%4CDS&5c ?-2v?֥ԻaQH7.H<}Xb:Y.9ATp~hSxKh阣e곑2bpUqH7S@El&s+ci%QTq\ܪp9?w" F;NI═EV4I;8שuC2s@p~I+ OH\qP:=ĥOר3t;:ԙA]y=z2@W+VUa;/w@5r76@] K{z[sZz_R@Jg u-[yzņr}Rr`x?&9zVq$Qc9M=jW ɧ5+[hL* 0d7cQ}[]1HCn3Aqꎭv[s;Vo{VJoaq)ɕl.gRX8469Ȏpq;ح*}(!H#TG[Wyx6 Ws[lڤrh3I62L? ǣiKNr& ETXx\D#$d*b) ?F{ RK%Y;y4$v,쑗"#.m_4ӞVp|S`'䰉{{F,m"4KNe jem-L1ށi>M ۷x#rvghhh Pp$~3@h^)Bƨ7`ͥȱbiRjkHU.Σ'>iG\A3@t%pOXR<.kQQ%fҭ w9-MĄpOSLcy?4lKTAf84<&<\LǸ.yjI!ا`n&bO$y0 )Mp\HN];( #zQ3_l~ݜ E[Mƪ 凃8UFOހXztc-4@y)2g>zc9,\6qA$ &U1jkxmȦgӅ4Υ`nn\* H⒒F1YƯhɧ ޵/N$?M779VM~#;/^nzӺ(ˀ %@+j|DEn+fMFX Ɉ_tޟ.nHkH, 3ҺXi'݀yjmҶlo'N4)@!HZ7W~/Q.LaTy. IQ =n*HN#6NFrh; [г:צėh6`zǜ!YDL 7͞K֞B2iu8۞Nh%C I1W8Qۉ]d4wSUF(\!≢1a@⠍v2qNW8Gje!` xϚKJ=s{؅R8_9[y@}lwmXxU$鋍NW{$8PV,襅 <~i)dzfM2ڠqޢ͛FFIA/m Vw _zԬZEU^ri[cSq R-)Ēy:!IUwEXHYwڸCS( .n4eCI31E@JpXx1<1DeO uNh^lFX++A˓x42VSY|}QZ~[6:QXXZI^^0ͨb9:&e@"aރ>Ӻ~C˕ CZ}MWYQ(h)>3]˭-%@N>qUFk)v(r1&:wQQ1.U9Lؠ4{%V vqV.1'Ռ׫S-:pTEeQ՗Evl탥m5y1$\)iebBCZݤ7+rp/w:a.c/$[,3g @7@`aTz+BLZ-Y7Z۴[(`XnFld=)$q`*czt4 Ub؎SI=յ#*BR_Vj;x@OcV ?xmemDkRx,㶸R#c2j)4gh$YӺ:c#wluͼ$(?@"J?vrNsEVwc❜De$RL͆+jomN"UuIJw;Oj݈"B9ұ wTS}UKut^p =k-хN;eSi$]1Z4Jei a4 eP lGrs>gʌDS0~Mm9?1G("Ili)1o!d#WcVn<tyC溳ll$D9#hE9 @`cIו V1pݩTWW"?N!؅yyN3ǵ$✎Ic`n4Z$Ie\{vO#$QQ c WdF8^h'>q88" ء.s4Ra=)S1*1KaܟIGDLȻ>hg($0ac%Ӻar .;p?6{!o|G4M@psջ*`Fʸx-Lʤnctw~RH-ZDM9-jE}3]Đ0^G.7[ GqIom͖ @AliL>Ow$bqQQ]ۥ-2v9[ĖF'CZޥE? >kҒN4|X4d|Wt$Ibģڲ;iP%9z[l!p+#:2LߓX{;fp2}֧R7̖{u*>$Y5#e&|b4eL9b*yIXQMd}uԏjkyprEz./マNw2g$=HQ9.x設mUH6ߺ(4bٖDבu\Jw.%7ߥtKvxTOBi6}is}<@NkE]]暖(a$$LIIKҌ=F mfT˅# nc |Tn9@r;8!ev8ҷLE Lc(`frOqXjsG*j^AVW6*8 B hp; ` Ss[C m @c6}5oګ}8)9Aeb/d`=Ւco,ZK8Ut\dRÙ(|NM"b"vdQPn C$Xu\cxx:A Ž<25>"*G޴(/=4\3.I+NJJ-=>pk:FAd-֭Πxm h#%@i"匃'f ذSjVڦQ"#jQ-68ae sAVhmneٻǚY92d Ղ[BP "O!DeLDւklRA*ԺDse&އKv\C+jͥz9Ilh.:kk[qGVzaVapyQjke;ߥQli%l.[< y]we=tAwP|2YQ&"9vYC*"6x#C!P H1E}<s`G *4'/#_JrZI%c7lI8QՄn)ߢn'Lj^< y,LtS6E*ޱv$(4s< !Ѝ+) bEMsq&d0{} 3YHd2{`x$M cj39)xmr*ţM{;*B9\[u;ꔵyq۹n5Ѩ 'sޢHO }mm5=0A81F8•@w6>1s}KZ 8j^Gu\2#f8n/[ 1?3>h6n9V;憎SG+8ڢӬl~)zΙkn=C)P\UD}IF7ͬ%ީ)-`l'A5mskqףT}ޅS2 ئEf[7{s`8fYxT|u FLMbP6 z WLy&Fis6WN'zꝜ5+p|%#Jb渧qڼ9sAiuǵzAzAzAzAMQH.?Ǟ)VXT#u S b_{Olb;5 t{8"Evh{]@)[e)vℑ`POɠt,6m(7l|R P,wa{x ~)1M/t|2O%w S-)'+ijF-.xS_jonu#S!ե$X\2K>K鞇.I$r;gPY#*I*ԝ?u^ 8~o(ֺM4 ǟGF_>#d(`| ;u u-bkэĨ#AcK#E.5.pX A -5$ԖwNqJm-! \ K8 &Oy>_m4]1;h _?5]Ex&*ޞp]P-@SoZƍAc a|g}A1ZDWTv뚚=:vOuhwln.CA]֗AVu/$cU^j-4٧`b7 Ͻsfֺmg |w5j7!#Q(*u'D.pHy3Jf8;@jG` ϹnPXUBVlvK(cU4dHSRךD`xW"ppbAgO$+;* 8"/.{m25藺$Kq&_9Vh#(3TlaP^βF$!8jv߆7btRlrTI:[@ aMсQ["a%zjyN2kW48PjzOk6];:Oy='dL UZͮ>Ls,2{V?Eiw6i&'MGީ啰;NX65i*-moc)ȌHtWݘނ[YѿjD}1YZΓd|ïZ; ؊a3e,G<`PBk=u? I.?8N|3I$|-v^ J"V(EEm|X8x/LwT}bI_ķt. li"zWH2$^ۻp()ccckin@35dc1YupT{eJPIY':~8Fe HAߎi&arA \(h3H EXJyc\ J~c]s]TžxW7[.}I}"F E2)fa!)'XJ7ª8bSESҞK-N(XX<Ә(_;4S< zhW>MxlgsyS]#4_[Dr[H 8 3P1,yS_kZ}Vdj&-dVG:jkx&T=OsvF I6rWUzfcCp} GuW@F|S^M:5bIb+˴/`G -*эieslw=8|SV<]@ӝdteTFd :~x ҂2bf֦K$nA1ڪP@6OTu2N2rqA!:N$;dֽ[uc ;o$x?hDX"tH}8RmHs]:gNӬQ)r~ǑVM"GFI−I#8Tj SkwXF$`x_N1,G*n;rXO_kEGa\ =3D *Y"ٵ^0{f #)6Mn\owf( HãOƛ?LP3"KԙdiXU+ݼ]oJN1Xi׶PşH6sOGo"FS O9侖4UYA$[8јP|l]K()lɣ#SѬl*rSRiMh2rk_t[Y ˅'9@abft)P q:CA˜@oEsE}89qzcGztUwor͒~٫IVY>qډ;O#k|n첟$(`GK_Tf&fֺ $X zWӭcTϿFb%H6gW1N^ /`*uem_tiNƘ¨S3A0$!''9#Px"UzuWE8ai\Sڧ{Xl|dP;JG +NAjiZtrkgu}N #LK3u캅޷J@?RuP_6nj|f0[5+Y>9WIwcPEO$d>t㶆KEЧɭ`Eo粰)شCPS 8\U?uyN*sպ#II4펑>?VsVkk^C0(.uu3$G=iw+@Q OGtIv*sy,+A]ifY#a$^5 70ۿ*ۂd&ߍ6Zz%q@xd0 ,_h$f\$sAt}JVi. (yux|8 MDEe$D⻲1dVDku tg,F3AVkE9㿚Osz fA䁚5_l#h{exn v@cѰHZw@P&<G`Nq!WABŸH>Ex\-3 }T<^s@ $tj(FB:@}kʿR 8 94'_:UڕēF"kr3Q*(u)pN~֮nX@w[i̤>=y2Tl^[,dWWnj # Pe(tӦ;d!q7/%sdZ[ 7ȼ- nS;pI4diS: cO'((z!Jrщ󃌚 bsSGTI&ܰ>V2& g[7L+<>P 8m?0.@9?i }j{VbVyY|{ 3`qB_j6qUU \G+w$.W^ ^`$ Τ">db}bQ&oU^'NŦzc\m^ f>!Hn*XtN$G~.xlh}W[y" P1( '-Tk>$ J܌֗]%<1f5uK[x$1;KӝS Vua&MvY6;A~hRsgh4nX}$l}9n5v $i(Q |yJs'*IoMgh̄{dekodȠcTg"k[@;na0'.4t*Aa"esvJ(UGF9>k^DӍL6;hyjmtXgzy!Y%q>ڍWS[=E]])${( gg#"mrX]dM %dUl&AvXP3%#~a#HV'iS&lధ%$*h+ȬpLb1<%;E;nfF,riL9O@6턃iK; bb3'柒J'@y`;|Kp ~M#$^ͽW^;3hDGaMz)K|@~gvi \a߽ʱK4> v\ S/gp{@=EOIK1#5%Es|SY>kI^)VM\ё][1l``T _ݼdy,\0H6, r h3\R(,Y)(rS/O{XQjyֆutUovSP\ذ[*eYje"bgj=O\Y+ Qt'QxP5ҳ' Qh 惍0H!M ; 'TZNpЉ-: Y\~^HF#;qH֮&f X@ PpVEb~MvՉ?Ƞh]E\4)?h0?vJ =.W8,F~(%o:zm9p2涎4dt2ݤJr34zIA,9X`h`}EWA{ X  @=V|ׅo5 YTwUPw MWnfXqC7Rطu#&t8Gy;׸¦هz!=FВIUDLslE<%q1Ȭ1 dKFwpõg~-ĎBZɨdhރ]m|F8~)]GnC'OkWf=INҰI#5aR{_M*2ˤV0T "Z(7lK+`sP<^i2OSixt0L3d{9P[]FKV8 8i&˧D\`9ɬ` OQ E4ڌM%w &cBBF7d&1QF\HǓY@"Dm3d Ғ < ?LB2rDy_HAp`Cɸ/.Ɯ.x(4޸K"X}lsvӄN(M& 7x&w1ò8ȤXuUĭ ~995Xe?m9A;gp6j@rXqse,7ɷEyKHNYi7B=BԆ2[<]9i^\ƈ&c~_#2AA_>d=x4+M()M6c69a0o^d9_.3W?Zb nB"^@>M?E6ҥhk$=.=DEHj}OqqFAc5~'.c$oҁ #4?jí΍4JV#~9곡\H&yq^"ʕ'rvNڈqޝ/V.y#⨒GR^}x9?KqdSSrK)e>NEzo|Hm,}< J OsR1[zQ]?}.H ѵޤK@ 2VJNѭo9]1Q@ ExPyF[$ѱ)iruКX!H@  qRNYF\:Qp4S?zj:ƣr>4E9ځdQ0SԈ_h?z WJ1 Oj2H70Kp.U6 =$5iM4oj#HV63G槴CR6D? ƛmrYp]}z:a}R}z˪ tj>ˇ6A51woځ۹ef|Ƿ5Ȧ^fUJcOsSZUrGIfO&df8=պXVD$]C6vae8 GIteU@xUΩ<սE7$'j7M p 7,Q,#ރ'Yd{W]ډs[. D~Eznjkn4ވ-i6n8_id-~{~^[LK=;g$‘/EKgbG[ʵAR#J^9P#i G4U᾵psq (71oNOn歏y1YQ 8(u٧,_bH|RtpD$1Պ\82?ڠ:XF1г ړoqt!8VjDR' yRZ(; 1EOi?k֑> ڀ(t+S¤`>*t'֎ ώzt5 3UKD rh5M;N%DЯwjCw~Z،F4Ns"bsi,$\xM[+v`qgNrcdC!t_RJ{z[iM,q3,`?,v|֜ISo94ZRiZ¬^a6cj%ϞV?={O]lލ:B?Xhs5]YSb@ZEX#ǿ~"=MAj g&:}6EZz/hNhO=QͫGIY&=cVh+楅#;[z Oe4G .hC eG"wZT4'< DG-n6\Zw8|UKR!Z[;75iVPtXqAvImWӒVBc=l,;uv#޻Ut8_42ݴ$㚧*@$ł V{205uμƩ*3#hXpu[6\`z}F1Vnlo_B=hԴe8kKStfX\#ɫzeϦvq<-UGGj3m W4^^p&03()zְm9 gIrthwTdA~'h鷨q|aTqT zlRtտ{Z`u?֮?7Ȳǟc7 HmP КĖW:l{A񓚾\I<#_?jы83[i .أ6oPAٞ{nzain'{Gj:PM#ȃjbu7wWf =.F'zt\i"R>GS:H@NhI/IV߱>Pf}Gxƨee`jt}HpXBK9`;TNA,mH҃m¼#\g#Թ@:3 m(mKԥK &dQ#(=nIK$QNz++˃AOVܜyPǮOJP{ֵֺJ/5\PEG|feJZsIE۝⋜.3Ѝշ mf[k,JL GԐQc@Hԟ G q“i+ma>k+K64Ar;k#1j e(4? {T&ղj-Vnto*ABM1&:B@fl |P\SQa{\Q޴{Y DQ#(&Sݵ̠ ]ucA^HZ5Er:*{;\Iqx'XѲ+#3r QI(*I|PX,2X&䴿[ DVh)PGS9-AfmtIYAUPAk;Cx+O  { q=Ma᷸ ʽU)uwX.:~RSԸysʚLѾPMw;Xr I,!d?qc dʜqJ,g&w~4ٮ2)-t+DJ\],LҺ?XOZ^Y\,eqWJRJei,;M1,Tpv W5QN̑r['G!o?CoIGqR5ַ.֐) ɠ_fqRv};C J{"B.s!yc,E[wqKeuMEk0a欝)B b1r҂:#BKw5|B~vSJ;yTL7_C[GbO mdw y?l$Dr|L,`%s$EAi>gj %[H&5O>vlm=W8-dd(qޯ:uz_OƟr9&"GcE:)/˫ߜZ'qGYiS%biI+pT,0*_ObK)3G0@<^cMΛ@9$|9Eߏ$T ֽ#=I <|'c@TIv2 k\tv7qM[$(ErGwԆ*d\848UwcƦ)hw=4G{ss"d#{kH:~^wA\%̹o}Hc_S"Z|e#~o5ig@C@r]M:ב%Ud\ }Ƹn㵀C{J O&}EfpOw3Zo⵴?%ɼ-/GY"8YǴ%շ d!&լe/%"BYGyScFn8QA.BƟnjWfѵ+]{:QĪ-8"7LJcɠ¤V9?ejK!o.sс,(钶YcP?PD= ySM>$ǜͩ8]*6JC$RA"{ /s 1simxbFqB3<@,A'8_FL*UjriH'}k섑%YpbR=٤;Qv3Ei6QH$tk l]z>`w! @~ h-SKid>v}SR+]WՃ+)>"kFo,`>ji4J1*[{FE&b4M&AfX4g4 ;PV5sT aДqϖjdNVb`oqxVTG[|pznsnAU[nLjmцAit8Q چ{{Gd|Vڣqds5e"Aͧʃu|- sOsnvZh !"p3ڍRۑH[ȍ͕k ˷jI/^#3[q>jYH$Xc{2qU4Mn y5^*ҹ{kl~dRsv-b}QH8TޟCO1~v\CXAkn?j'H^w4w$ @+U;a0(4EH.1>jqy( ]|{sH=%(,fH QZ/NJ -"ϗv(4iO0q*B 6T0&c@%:GRUMs[+Eo$XtQ wҎ5RLV _Ëʙ} ­IsxS[4 F4.frbe`+-HG+Х=melc'ั$IA?<:$PDALVO0_p5@ꅳ=KbcP P3h $.[nF|V-jJH 'YN`!݁ڛ6`'2q@6V H6TV[gXa1mhQO)"@<H`*w9AVkGA@8j[XX1=Ƣ%{$\(+%!>`|c4k6ù!e&XP.W a2[LdsN]Qq-HI =諹᱌ |P1iAc ?i} nǧ) <0?!4I$^BdH{s;EaD޾jF]9fO_f%c ?ګ1Ꚇ+mEnGJ2.Uv8]wPUP琧*BGKf/t~SOѵDߎ8TѴiʬ;&N ĄL$7rB[ߚj `D{(fN!3,s6ӊiPirZ,/Ie!5Uum Ze"59- KvaF1AZkm:U,4kIVzUyWkAѬhfGP{Y*rP5Ξ^ɕbh4/Ha2ܮhį+\ a6ZklW ?Q+j&XBF(4 ~*!-œ S HpZzd$@E;OR m yAꮭ yg=" $Pek +=Eu+''P&$ԑީ?nun߂sAh"8KEvSǑ⼚ZAͽ (ԑ-Y"(474yFw267,} BV x4 ,MUtvvxWg=6 Uu=cu6 +Bp3۵lRvU=ⅵK\]Wocy sj]Qe#gsAZD6vD#?J^"Ŧx"8 p[:^%=`嗎PM+E [5fVEawJĀfչIB)aS(kX$0޸v(a1UA/ϰ`ђ "L>h$nAӡ85)щZQTyom su+{|:G=$s!P*#h M=tѨ#4t云\LW>(1)uMBr$^Wަө "$[ׂ!y?4]O _AFIX@NIh.|}smB()H; ϣGӥR?v;Z$mpX{ M%&?w4Ԛ8Qu*O2y7@ P7sļ.ހyt <ٗqAR]$0[vA'sH(^Eg-y>G"sK<2Qc,5u7 !%w-,&Y_#v'^v5Ϩ䘊(kU x9 -fDH`ѴgR_*\&R.1Z V9~ൌH$RYR};S]Z˱cKOU'☛XgXQ$`'Z;ۑ9HE Wܑanur^Fl(8&2_͍jkco<9UV`pynL/֤-aFp|Rr9_PR5ą%T|}$wO8X ݓL.!AN墴 EVgSo$E܈ Iohđ{;J4~xQ4o7 GlruV{p Eq9AAm{4 8僧U3&-;yb9'.uFPiֿ؅yFeԠFy5+ܐn59Tu; h4c\C,* _gD3>dP% d;| MjKoqofދYlSnHJiiXPԤ &kU4 'URWVOiu8#lAZ垲vŰmǚ *#,1EFd⊷soraPV:iC7;iIUI.ǚt]g+3)caR( L*3({5oz 7Ti67$)0j!xTfob܏W4uqAi}KOk3YC٭P\1s֥mk{k^3l9=z.S'j 66UqkײѨׯX s*XʋuBWT|[][s+2#uh)5?|U^8O En{Rc4=JUxnEA\P h1 ~qڣ5_28]Kqg#B!TXԵL39u\]VD\5a *ۧ&:gԺt6̳  VI#j.v[^Qozn2']8e!hIT$Pox'hvXr(zX]۴m*/)F&&* N KZF4^Q +6)+hs^C@rQ єV^y4}m)FiѠ\^q9PCG3Z+z32RuݓVi4'bʸ21Q׺,!c"2qNOdny"i>7(~;M]HaU7J"6=2[f)!T{0; xiSO8ut˫ḣaQ3RAaF'd>sxgoVj1NGԷ%v$|]:;c4>-N_`:q-C{Y"*5:I!I_/@ǚGYME"sU,Eؼxv>*jiYTPZIIv fIPW#l2G*׫#ypQAq:*ధ]e8У(ɪ[NOaH4i}E $"Ber,~R_IQ]S[L?UhX>@]ѧf畤kv;K =>h':r8[RPu4 򇑷EU1BQ; 5~hQZcukyݎ}Wq G eTd& m]\?=|RǧTJR6"x"-8sZ\_}8Пԉ? lb*%2~8@T~!\2y~h4[CEM%RІwPg}sq53Z-֕sbVU8n{蚼V7Q"[A"ϥ)^qΎ'Uh9Ǯ]GIui6\Km=-SdHqI331)#gWgiĄb[đD 'Uz̛rN-\f7P Ug';TkϥJ8X &OڊZlg$df^;O3rI!Ri8H-ctXc[hseq[.`sFIR[-b&9P99丵ԓIzs&$S^GrF;y- $B-n"M9 c4 ]%q{В T *V/*/5%be<9?Oxʯ?֗%K04$z/ ܓL<jB h3w U W;}9'WScjvDKkY_6N2ąPBqaP;SuǦ$ XpM͠c1p*aTPJ後1.e*7b5c|TF>sZO% cU(-;E{ ?cE.5p屿,񊑏MPibQFqڝk!REI42zqƥry#}66f9C 1'hӕFkP A:>N;H ϶[KPXn3NI8Y(ɮXX5RhP,:HAn%EQog{=AB$9$qAuOHXi0B&]lP/Fh&Q% 84}nm8bzZh. $yM]>#է]\P~PqG5g:u-:,n>5Vp~h(~b59AנF1s 05l]0ҲէzA<8b]Gu 2y'=SwI RUG#`STPdt%Q5uř9#=m @!Iz SVӆH*ipclцؑ!gԡ-#7yeXG?jl] Ku;.`[2ù=%ȷ9۰~LmJY@ªG*V)j:h]-ˈo`-[lz^H1IN VДB'\mXOXhK6hDt͉$8)>%.dD>-UgF@@2Z뷶#djS,NAzAw \UTlncK%TqAu9?4pZgʌjU4{6>Atޝ{ @;&t]n}p5#QjrF;pjmch){8#z u%0vyo.bہ߽s G065j2HLsß2`;%֒4'6PAPփlL&F8Q c=N ʫv}ԍͬn=diNTsa;@&d_feF{WEcf3X^'@8#ѼXY^>h7AD'K Ȑ)Ukk2LU(:lI-4CɺI`U/6T[Cl/Ue vZkPllW}Yzs D<4Π+L1KmıuB"4khEeiFE:mbhck0`w%O-3):U -9[bGokt]NIhcR[L6h,PkW24f;mĕX4b5 |!iJEA=!$q̏ G^>]܂ =1NXʤMS-Z94>Oz*.&N&{}/V9MmO>XgGonW%@xL+#|K*DP.RZ6aәG >~'ck8y|)7ùB9?a@ Nb!e%Z\^˲ȫܩek;@Ŋg"Ajoekm [(5` 4:6{F;TW%:<Җ d59$F8gXt2o9(#:7I\e6kx\EZu3Mrx(:_P'bZK}h$n-d@kH 1@51}GQPw(F=*զ , Jzn]&y-y2HVop'*"MzP0_<ݓ\I޺6/sA5jӺiKDF6cI}>kcFAFKdA,as]a@HƃCFGeAژ:{wޣ"3w(ϊa.96HZh %]_JMxAYnuaeh h2 aq}\Iٿ ǽnvwډ +*C`xНUv ~h+Wh'R]"5m[g(*-bg =xvqɬ~mi%v 62kni ^hF~w|o%`ϊ +#{]3˽bJZۜ$ K@} ,Z4w2){qHU!Ri~g VKYi$x%6_Uʮǰ6Q) `f=!i3`j&kƼTP 0LZT:l$@K ’nVlWSLZ8AnQ쵋X3&8 >(%"HK!n;T|28rƚ#mqPJ$\BjV.ECɭA u7'ڋE;I$~_PmݼvOOV֡Rʖ JtטKt =X5`a1lfK}gKx 6ԊImnV'?5hU/c2eHS$Wji#>m5dLGk$J1T'A!HW9ҮzhCf͟O\8QQJީ*FFg۟Cr18SxFAdRIT-~)kI4b{cbNjVKmcPP9 ?SGRi. ZѵAiSIp@ROA{dh#;AGp_SUo G*{Y"E7i.@gQi D._)'#%i1VVpsqSl=[!YQ]ZťWyCJ$. ]l,wڹ=3@$޴Iu%e\k (Ӝ[z( >U70{ T'퐟Z=C>yuΤ qjҶ5ܗ;c4] k28>H$: ?SvJ" N+l@*$UK`XABLCAfu7ݾǜQw4'v zD0v&mgXeM$vLL_m l&cm9gzk+C7 Oe=pw Bx`Uryd=iq a]i6rGqg "Xfe>r{օiKh&#9 jl6PX$MI}p7)>Mz{E'!;ɩv .ު:" &f$XrIvY,̖뼱%?KTRҜp57ۀX P)зqh)%ڜGi ,lϷ7Lq_P&M ^=>;T~XZ;E:Orp 7-Y'Ǻ5 "uӍI2K飃NBAF[Yꑨumbs\)XG6^lyr| \:LU;(O/[I"+p$k =4[A#}z R[x.0~~6@szTeUw;֧'O]][*\PK[>>h#d#0*{M=W }d0IS@_5W%ݼNTxU8WR8%10$Ln0; R,?o׃ _ F&K9QQ#,QE-r=R=5gGj(N<~ӱx̠4 / tm7TX$ԝ}BoR+)=#)1 /jc]Zds ˯ڂL3+~f^>k=}#m%Vr^Om ђ$MV-../K[M 'ˬcl" [vV7t1di ˠ~A2Y琠jF]#⠛[Eg5u1Vqh,_{ ITHa!E QQkhKX HiMnݷ& ?xL1=mѭf}d rOsN\BEl<枉lë9io| Hٚ⟲{G]Tew6Ѱawd42;fX-1=gT;v+{8Ȧde APiϬhvOPzM8c2U~oL '>iљD|PEB OETJ豌q24ַ|bFbABl^Zj2jq yk(^M؜46vF; N/c(rsQ]%UX65c™H8帩7(uVbe&6 /v㓺;K`-WU䕭xƗG`ߧ4!a g"KRy19Tzj?Dis+t ?HZ(+1GoPI\yn皰?UHLːm9_ Av8f$VޥqX? -̀~P2z(3 1o}X4wVk8;2(W ڼ ix>hqUa;&~NIzcO Nf.B~P~an0:}EwcV UbfsCP֫49$j]#SI:Z{Xuf#EHl^ݵJ299Mu 6&GV&߱# <~-i.ms~3}FjKKc+TP~{%ݪ [W %Xda4ePC&3_CR0IJMhM8YIUEcbgxs2m5%s *[<h$Tks7\! R{f {Aq6sᴉ~O!j\L`x>h&&$ 0>{oꦽ,a^.[+3PWnۋ4VQ BG]tuPwO=#Gsnkm2XAӕQ⃛OvY?c: ˮn|bK;xp t(e:t< ,PRjq$WGzLP3amP{.-m QMK9aL$Nž'=<$wVF8@|b+ig $l9"  ԣ:c 8qA1+nMNilsqy]%O{I>h!t>L^bM"}P'S}-lL"Q'  tW){p|,Ej$/z{Cv6KvD%}zAIb89 d桵w(ltMG:G0h2 Q,Mr4U\Xc6Kjk6xl戋@b=UQ&cd䓟H/V&$7!sIɡ"zR A\ަӣԌTˑ5hnYfD9`O,|^|Iݚp_E8bc= FB7-ޕ ^1Y-m`;GF}4T8"(94#qM|[){,k(ǻ1K7Z;i݁=.=g`(P‡R[-//T!;5"q,;)," K_icq(!ʨSRG%4ZeLHP٘s9NL6юڅ5w5Ď#E;|( G 4@i,cgwu!OjJ,ۡ*0֥g DZSUirD!XQv]+LP2#|cp U_v=2X˖"3q!1[|yc^f؜7 `?jS`B@ |2C N1DZ d$s^; ;tuY3 4U&@(<צ̣fx{+RT>h# -쓛u e̦8%Ls@ mZAgHGpшUGqE# {|w'ֈC N.'@fpiJ)*"[4_jObct+&FiHnT@>)ƲyiO꼶O:e-qexPiZ,ݥRSߥy/jQA_| V%:-+DYcdc'' 4,}+~,+vYk韞h4Msr|f@0ciPc`;Q2?at6 ]2@H">PfrOѨ;$vҕԖ-s1~kDm<)ES" \=gWGɢ@Y$A(`T\srJ6ʸ9١!I$m{iVHXr1vZKh[8A\K s?9ǣ4ᘜެjbά`;,0jW(Q⎷UnLq$@ӵ֐󊋻Py)'.IcCZB 1Gj OH|y m\|um.su,vj b;Pkǹ1XjHRVI{$Iy4#d!T5)e-QMRHX0j{15 GE"q$ d'4p1?)d+1y/\41\]4Io)$.[{L} "Y)QCuvr7{ ^G[tRUko^LFN}ԩkBvo㳶U>At햑d̒<k@Qxebeo Bۄɭ;K+b$ڠm窨ݙA)4#eRIkoWHQMw3,k&"J< 2DI 揊1 O` J@Up>[ n.I]sAJ~(v#@C]6țj4eo Or/Qh 2GJQ**)w$LsmO7w~o.2]? In.- \(Wp?)M[cF *>u w<ʱ(]޳c =簠0M:<Ƈ oJiH}F@g |lN[C$^zD:d02LI-($-#pnsSlٵ8~(HiAKw!ow<‟∴tFfQV) g'p&#^yUitE:tM +([{%1Ě K2>G˷sxdIW楚xDj8TY2\+3/sqO-*=Y_X_h6 αM ΥQGpjqx؎nٙ| -.Ac)otPߠP$>*:WOquZ S>FhYd6{`El|(l~>J.LLIޣm5*|ymQ-ԉ%]{b)yY"_Thp)Vpo# Ѩ !ju- |ѦE^4]ʦڬg,..T4HO#KEo8u < @ɵicϱvw*0ڤ0|s@Xx&K[T13hdFݠq dۜ"5 pP4iW{Ā 9V33z\PT8UKkil(E#$OzbsU\nڲ0iL4+RVWZs[/"^x$t 9?Mlf:sNbdsɺxis,I')FYWw;0m-sڙL>jz1\cځtNqMܼQ)p=iE&NM-k#A@2L=G,OơFHJ)x"*AHb8[6qzv\5)0"1x&b4X\D^Pd>HrqnEH By_4c$vӨB"sR (QH1'_~!Y Rq5ݮ'$)l1{8MT_Mpqmi޷ )jnhZW?OP`)qclc/j"N-*{fx7 $jCxSO &YHɩ( Fy8_&TJ\M7yqo`roKQ!sHO]is#O7qD˨qzV0lAԍ Q,!4H'`P?x3C2K*:+sph,30rbbtSc܌T]4=Rȍ:YR76{WD:$SM< *~ H$!c^#nM1DS`f~Yc.=egg%1cC-C@n|P=N2]3BNNA+7A]H(p='׉GAVu{:[&PusIq^$B!CM] ŗW>5ޫi92 ޵IznQǩ}a!Y?QOWoNcU~h-M6@0w4uLٳ 2?N*I-շFb[Mh}"Wg7gwN!xiS[j˵v 'μ SFu.ԍ#t&K =r^C[4]5Hlc 3(|1"<_~N"N}f fFX[@]a>("QBh{0Qvr94#mR.=qA1?2#Z H$HLqhY22_ݴΉ6ɭk}^ wzPym-, AD6E&>ElIM1;5t:Q$5yKG6zۡGI5,X6ۀ yCaϵ()pN7W5 mOid#ڨ `ҭ B8bHqdQ#;[Hsyj!asj *{ Gֱn܎(G>PH^i?ry.&i\ R6)ydUC|C[ʗGp7SE%+0PE2TڸŲb*(%#rZ8̍Oj !p֮bYO1*C3ޙ}Jfiq'5C,m$Ph-Gx\I;5 iHֻm~z]bQ#v94{bj$g+ơ5q{1'ڀ[G,|)zѠX=r@aāA#"ˋGbyTTC~[E>ij KdXQ5F8Cч(Ys8I 2)A6y&=tXN1.~o-2?ȼ1>oq ׁ A]OilDV¶i}6 z%#.~Euӝ>ӻ8 [ܖdv~w&2}Ɓky\eh#H`4桧F*zD.&q⸖|( `Ӯp|⟇FnB.sJI1$s@:CA#QR#& `Oz@)K' %3޽ERh/%+AeJJ:0QzD#,P%K{X}(C5 HÌBǽBOm{mq.h$P%MfyG,4"A'8(q" y Ao@iHPLr~jƻ˺ނը A${5Oo9i'-F}m WΣ4i!m˸757ks8Y~)VF-̏OLjM6>ݨ$$lQ܊gԖ9}Vڇ,sL[٬Dh+[tfRLJF婸8 v'ɠm+ Uwk82XJ^'v2q a<抑wM4 v؝Al1q^kc&OPCqi;AUX)VlědjX1?aOo'W?zR*ɠk}æ~Ԁ!9URK ^sNifcԌs}3WvgJQ0QXc R&a eu3ŽiY%UP?Jm&q]h1v0񪓽G@qkcw@ lk(=.{TmP;|! b 4C , "ڙ3()J;jIxXFrn'G>ECj  `/`}[͸ +ΐH~]iPDW2gsa|SD̎@11$SMyTpj^Uq p؃>j&{y q(׊r&l 5 yFP$c@5]bBp3Y 8P7⡟OH1'䗌78C[Q>sMZ钺;sdcM66!8푚I%t,(Lw9}6}ݻ#fQ_{7 |!A [W&/,Vȡ731ކ[39Gj8!lq@[}(l@;QiJ%)Hb89튽Kw8 7.99#<(%a^ݼycp<Nk®O.G 1s@p{Ik8&D n+!4ɑP*[ڸcQ3K! "-A6?:D$A #qKހ}HG @Ha9884c]qPtMʛdnSʡiD l@H͐+8g'؀0"EP8;~E`?5ŠÁi Ɏꁌ˰Fm*'VUp00D#\3R2T=l)hӃJ{vH)c5R+TRA|f,Pʹc ۬b9O}fn3U5Ii>*OunX7ޣm:W恛}>%\o"mf) ௴m5\KDb7vnu'r+`c 3:0dq+L([WXHuX)4;tr?~AKtΥzVS5nY HAK*֪+cFA`=Sa :8,(\roj/KK&\񺇗ܸi(#憗..1IdrGli=BϨ4=ơq OSV5$n~>UPu h?Nh]zH3(,}"Lnv1cO)tl݉#=L!UDj:;%Y&o:-9#QMԷqXWr oͭRJ"WQmء>A{7Ϳ`WA40)1T34] n4 ܘیjᵖÐMpC#CYb`8sQr+vbA4x?5/ee .PYaOq)ekҗ`(&yb1Pw!7N߿>854 )'>){}q=mLdӐfZm3@}i't/H`[qbQ9DfUCQJmmI Š=C>h ~QA sy91pOȩ #CHH}G";a[ڂ.IqJsڸ'TZP\S@\ rh:ed׍ֻQxBH pk${4=5jOJwHh4iqi F)I#,NȠ9M{a')QTdJ<1@0;O)7S(Cr(Woxtw⁏|W0'88,iŷ?A+H #E^EQf>+恐ߔbwY6>ԍ!Ž>h=|bXv6&s$D;~iAI@8I9|ҘO_i3dF hORX3&>i[%'89<6#enFxH{a;Tq#s\7C q9- hRlS7Iq٠u{X4 ÎD^kHH@o3nӴ`AEgy&T(^OU%S!>֋oK%bq]-vALKXpVRAحX6x[pM<ۏ01AL6׬D%A-.=w^qklP81Q;h>"1`yasZV"iRMa&d Nҍmh,q[Gt%?Z@l|Aϣټm= G/Niťq?{yd1rF_e ".O")/4 _종:ZMi"$۬53ulNg4o斚-ktfurA/J;?xi&a龴obSR;Vs,wsb*ʨ6R'1uN[3.[ۯ}|k3_FU#O-einW7~f=/eeæ{(h>ߊmcW.,P6eڊO/ :[r<`y D6>(3$.C1]y|}h⁋Œe|s3SOd-!%7|efSylI6}3Ud2chіrY2~\pлfsb";tG?K sOF0|f5g'tO G"D!]||Т7yGR ŐzdHg;!7ɹi.= *Ŀv"$v5+2._ B4pXcn _&yT<$rOoA Node-path: trunk/prototype/data/images/background2_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2584 Text-content-md5: df53ad2ca9ce602ffca49e2353fd3ce9 Content-length: 2594 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH oFFsuG pHYs  ~tIME  !M9? yIDATxڋrUa=Px A+ 2!6=9| l*W难v ݼ/aHSBKs-iAExc,WGTv'֙* M fn sߤod)HS7 8Яmnґ2ag)XL//ΆۡYfKCu,Koۤ)(tafܓؔԧ[9=̚Yfz1 sg[,0g9\L[((>߱2afݤ0mҫKSlj7X,Ku\"06 L)@6%@6e(rJ^K9?Sl*LSl]ؔWaҽb,)@6 ޽P,燙u>s*Y PS&̚0/2S,Ua Pg?:Y8}4gg9%̚Y:IOSeX.|(lg9?Y:5(,>pua\d(@v047afݤ+/>sìI;<(@ P|a8\ۋ&%Ǘ< }r l 0Kny(e0di`/(@ 00e9?̬{/F 0Kd,KYsv.vu(;v^Y7`v }2,(gY*̚Ym`]d(@ PB㳌̺IWbcLlI;(@ sz'X&1|;{E 0KO;zY &\lJ`< 13.2(rm/ƚt{E 0K\,K>Kb%(@ ܳP,+r0(,|yhn̺I;->e:/2e\Lya(YXsu(@f /B㳜f, v[`f¬^d)@f %93&\lɁ-@f -/CY(f,6o|{(@v~16iYz1> PY#aҹX-@f @e,KY&Kbd)@ P O0n˽(,zWu¬I÷)aRx`lnk{1ߤ%םdž>Kb9,(,ͲTe4kl P`3oBs̺IWlbs+e0kne)@ P=wUub̺I%wg\,7K 0K\x,f,6/2a P_ X\=-IENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 1676 Text-content-md5: 5fccec375980ff85ec4bfbde70cc4f52 Content-length: 1676 background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); // EOF // Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 7904 Text-content-md5: 738675367d201c1bd5cf7276be14370f Content-length: 7904 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define *before-house* (list (make ) (make ) (make ) (make ) (make ) (make ) (make ) (make ) )) (define *in-house* (list (make ) (make ) (make ) )) (define *forest* (list (make )) ) (define *gateway* (list (make ) ; (make #:adv:bind (advent:makeobj "takeme2" "takeme" 320 100 150)) (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)) )) (println "Creating game-scenario:gateway-objects") (define game-scenario:gateway-objects (list (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)))) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) ;; EOF ;; Revision-number: 6 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 24 smobified the sceneario K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-29T10:15:32.000000Z PROPS-END Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2750 Text-content-md5: 089574980e854bb63014b49acb5c6aba Content-length: 2760 PROPS-END // $Id: ScenarioSmob.cc,v 1.1 2000/12/29 10:15:32 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("scenario:set-current", &ScenarioSmob::set_current_scenario); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; // FIXME:... while (!scm_null_p(objects)) { GuileAdventObj* obj = reinterpret_cast(SCM_CAR (objects)); std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << obj->get_name () << std::endl; objs.push_back (obj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1473 Text-content-md5: 946f00b3c037f8b721e98b33409f082a Content-length: 1483 PROPS-END // $Id: ScenarioSmob.hh,v 1.1 2000/12/29 10:15:32 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIOSMOB_HH #define SCENARIOSMOB_HH class ScenarioSmob { private: /// The uniq id of this object type, only used by the guile internals static long tag; public: /// Register the smob to guile static void init (); //static SCM mark_obj (SCM smob); //static scm_sizet free_obj (SCM smob); //static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM set_current_scenario (SCM scenario_bind); static SCM make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects); }; #endif /* EOF */ Revision-number: 7 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-29T14:11:00.000000Z PROPS-END Node-path: trunk/prototype/configure Node-action: delete Revision-number: 8 Prop-content-length: 125 Content-length: 125 K 7 svn:log V 23 Added another scenario K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-29T15:57:51.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 3811 Text-content-md5: 1ba5f34b23be2ee1b23531f571cfc03a Content-length: 3811 // $Id: Advent.cc,v 1.3 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" Advent app; Inventory inventory; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); Scenario::current->draw (); coin.draw (); font ("font")->print_left (0, 0, str); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 3372 Text-content-md5: fe10a06ca7a4456fa5f7031eec918417 Content-length: 3372 // $Id: AdventObjSmob.cc,v 1.3 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj", AdventObjSmob::make_obj); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; //AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); // delete obj; // do nothing return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::make_obj (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos) { std::cout << "AdventObjSmob: make_obj()" << std::endl; AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (0, SCM_CHARS(name), 1, CL_Surface (SCM_CHARS(surface), app.get_resource ()), CL_Vector (SCM_INUM(x_pos), SCM_INUM(y_pos), SCM_INUM(z_pos))); std::cout << "AdventObjSmob: Makeing object: " << obj << " "<< obj->obj << std::endl; //Scenario::current->add (obj->obj); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); if (advobj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); std::cout << "Pointer: " << advobj << " " << advobj->obj << std::endl; advobj->obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1415 Text-content-md5: b287eb4137f2db98d1221460ac7d985e Content-length: 1415 // $Id: AdventObjSmob.hh,v 1.2 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { GuileAdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static SCM mark_obj (SCM smob); static scm_sizet free_obj (SCM smob); static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM make_obj (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM set_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 3556 Text-content-md5: 43d166681d25deabfbe2d7d0c3ad382d Content-length: 3556 // $Id: Coin.cc,v 1.3 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin () { visible = false; sur = CL_Surface ("coin", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; if (key.x > x_pos - sur.get_width ()/2 && key.x < x_pos + sur.get_width ()/2 && key.y > y_pos - sur.get_height ()/2 && key.y < y_pos + sur.get_height ()/2) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } } } } } /* EOF */ Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3287 Text-content-md5: 5667d8c9060e6a2cdd3376c93f132f2b Content-length: 3287 // $Id: Scenario.cc,v 1.3 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (new Mogli ()); std::cout << "Objects: " << objects.size() << std::endl; std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 2986 Text-content-md5: a3596f1094d0cf9759594f9066d2d0fb Content-length: 2986 // $Id: ScenarioSmob.cc,v 1.2 2000/12/29 15:57:50 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("scenario:set-current", &ScenarioSmob::set_current_scenario); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; // FIXME:... std::cout << "Objects...: " << std::endl; //scm_display (objects, gh_eval_str("(current-input-port)")); std::cout << "Objects...done " << std::endl; while (objects != SCM_EOL) { std::cout << "Adding object..." << std::endl; GuileAdventObj* obj = reinterpret_cast(SCM_CDAR (objects))->obj; std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << obj->get_name () << std::endl; objs.push_back (obj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 8507 Text-content-md5: a0f5a4ecb3c7a83fd311bf09c55cb667 Content-length: 8507 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define *before-house* (list (make ) (make ) (make ) (make ) (make ) (make ) (make ) (make ) )) (define *in-house* (list (make ) (make ) (make ) )) (define *forest* (list (make )) ) (define *gateway* (list (make ) ; (make #:adv:bind (advent:makeobj "takeme2" "takeme" 320 100 150)) (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)) )) (println "Creating game-scenario:gateway-objects") (define game-scenario:gateway-objects (list (make #:adv:bind (advent:makeobj "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj "door" "door_closed" 198 211 0)))) (println game-scenario:gateway-objects) (define game-scenario:outdoor-objects '()) (define game-scenario:outdoor-bind (scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" '())) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs '())) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Revision-number: 9 Prop-content-length: 116 Content-length: 116 K 7 svn:log V 14 Some more gfx K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-30T13:11:10.000000Z PROPS-END Node-path: trunk/prototype/data/images/background3.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 40412 Text-content-md5: d3f6d1b907e837bac433aad7030e836e Content-length: 40422 PROPS-END JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222">!1A"Qaq2#BRb3r$%CDs ?(Fh;Es&ڃqI2" 9?$S;呰}-l)TqH<zubU)x# 袀( (( (( ( veqghIi|M(;KSf( (( ((9EWOj8t5~Pv(((((((((osϚAbE @7q4WpY!SP7r4E^( (( (( (K8^ tvX InzF|9HhN3ubӃ1@Ak@)y8UW6|@w4\ħAlD(;6nskr8**@U4{j; U((((N(;Ep(惴QEEPQEEPi,IT{"dh;،q4f/Nv((((((((((((8uȥWBA(( ),'C9E7' Lx^(dE(3('Qa\ET^6MeQ̇O( x=ӡv@(pӊr6٥a{WI@v]QEEPQEEPQEEP»MĖځE&\h \ qHm÷4{@+4Pv(((EspnEso9mQusf EPQE\Q@RIQ@f`vHywEQ@QEQ@W2)L}6&H`Mqۊn^]TJDUnw(ky߼PIzbk!4@rX#N@k98VOt(v;o9%m|IEu(9\ߞ1JP6K€/lrd$vCӔP2/mϚz خԪj(`N+עwgy4њdB&q^G$ʀb%H Fi4(ȦŸr)B ;P9EPRN\挏F9${I9]((W 3\P*N|7Z)E)Ah;Es<EQ@QEz("TWkQ@QEQ@QEQ@QE(((((((c5ʹ fA7q]h4i|IF@S=wq]((w"hbPvI4oU7+~itQ@QLym m$op U^Ng2,p6Y9%0p~V'KYz`xMon? Ժ @k5ԗdi7 UZZ7@A=~vP]ź(΋  $gvH (O!URAjMW{ M5>jl~HZ =oxq4G~izXx$_5raODIdV7oH{FG>E!jk!w%NlFJ 1a다VP~#)+У9)gD7mrYqAeFA©2[ȯ -1؏?P5M1J{R4t |V\yՍ{vJ˄l] LN(#PrwFE03]d|r>h (( (( (( +@QEfNh;EGqD_ӡbΊum+T (^c'ż^0=5>?Md&6qApYKSҥ,"(lS}UR_4#X`m](1jhuahEs#W P*ibCˊm] M^u@3i_ӆ8ϬvsH?4v2& !۽2]*MToYJ*}(?n|۰U_X!T~(1Fɶ #`Ob-F )HkgݒH P0Ү996ip .qVfgtF3[x7iː_xiSEu鬷0=5:lPe@ͻPix4ƚvǸ|5Ip0=i*J[*ߨxd5Ț9@WV$嫷aP~DZ%BsY[4g?$hRIBHGm&u=&Eό rʬx\cp*C;:6ANJBȱ?$hx⳺PIzr3Y R.ۢ|m,c!eju H1`ƧƷIs3dҮ4i;wHVm '-};$O$gl%@֯{XJ,SF74%ZBĸX4 ^ A$mǍo%ᑚ=6{' RO@\Tny@;pY#J[{c>zGP՝[q*l^!ȪvDNqzUG4i[WY]Qɯ ӭ>53[27vPѺ?4|unKNqEhaGVU<`a[j@ܞ $SE{({W!{Z%ESOv0VAzHMu4HwTRĎ+'WO$Lc㚥ːfŸ] xאCjXgi[sj}ͼ@{U_q(,96ԴMe@ :cǚ6ql8(=:O@"U ?ȯ";~|ՕT{Ad8b=-aX^x}9#*ݹ5:[яI[n]۳ TVwNҤ=]\3;0`AHS?4!fP)m!Ā}ڤBr209;"baqTK)xml1^h&r#OJK)?;=ȸJFjdzD{dyB}n"PxZ䕟$8l9"Sn?2X&NH4іܱ 74O9*N 0K[VWZ@a,W-G[[wȥC*v@ފE7}wGl `{h+e`=4 MD @5f徘H}LɞyɠrTQ"Xa~FkY I| ,p3-qy[]iLƣ ]=s9O;=ϊA#<޵q$AϴVEڂ f]٣)QM#:88V_r{nZ%Ĭx4Z5XsER# $,/½)粄#Oڃ==3v?0Ċ 5s{Y{dUKO0y-tݎΚ $~✅$]l|AO&5NtYRB&rW"HQcsAy529 jUأ*w65iRXB$*mTlo)Jh#PAuo(*O0 T-5ysd6o +vR'5}<{?-/8z /$Bs3(]G|U)(|M$cₑ4df`Dww47 i*$-PVgl&Bþ|Ԉ4& >;mݽAbYri䓄q`2A^\OK1ipYDdzUdX¨QI|Ԏ0)^$a⏬*n{i6B_'%Wڑd! !(UkrA+䷊1BX%4tQmv%gzհx-$0\W3]!6.l,Y - iw3qA 6+N1QfpՔVI"h,ǡ>IT1qnao_yrDznWP5km (od" Cc]2AH08ي=^2 IqPVOz裰4짾;U)G=CUU{h2A-gtWw*kzt5|\c5Mwţx{ Xǥ8eaBJ<թ4նm,DI&TxAЉ;y >(b%LL` m$|z,w upV \d'+4!pNOڦiULg+=RHc z(X܄cɬ2~'Y1U~:E;4-6\vNPBv דmF4Now4)+ȸ9Gc*N,dy#9,\nImLn? M15 2j<8>jK˦-gC$O+0' vw2 ȪD4˹'qރ@'Gf +5yR4QBUr^4"~ƃR־tG#uGo",8+$c> =+Evu~ RٙrCww=hȠ}6,n{ެ T(2׽MHV7Q*;6w,AVʹxYX.=6G"8OPUCJװ-gwaAѺK` *!i+IfV]c =L Bos>*5GiŽHSs@<%.qԆ9ʅ*lpA=l-(#Mc)% Y陊ԫO>jXӬfvp栎a | A_k ]B B+?<`R):[gPz6YhG>Yި>*8]I|1LBk7~#_&9Gwyuv]\xš+.\ȭEiV+l~h<.A1rJQ$u]sƽw[$x7R@P`<)5gi?T]qkPa 08-SDӞ&d5cܚ ^TrssP-d\(#~k3'IY#t6$ "Ѵ}@E*vjaȾ*F m7Qu1 N8fܫG|)zI$mVJϦܵ]#I!p#>ߊ yH@ˉc@vb>3M[Mir椥[> 5r&ni$#ajn@qJ:=;A&WT8m3Z{5%^#X| X\3n84ɲHv猌;5bT"@rO ;h *tM(\z 20}5 7d1 8R7(+R[hBK#O. BKago^<h*EA)-<~I[-c b$mT>h)sCU Z(/#R j|@ANHVCrb{g2nExeMv%m" _Ph02=A}.ѤԏRV:} ݴ)a{k6HĨy׷6%[vܕ"h)v,3+7֝oQx5AW- z#I%<fiX*dmF2[:a[ױ]lYIV9%f5\jd2҅6͚\ٷx?6}!Gn+0Mj sy8!ƒ"Ak˺L HM3M6yJ}"ߟg40 Dx Ji@dFo3R-[B#)AVM>/W #ԳXvY8U|_Ian1^{}*0&ayVfCuDR0 d{i65m%NҘϚ iYX[+N@G{*G#;$- wIn\5}KVӊ4@½[Mqfnv` ЮI`ި9>jתF#!,t9QE,=6>tEPHWP8'p(@"ۧ >٧OΌ7*ϊx̌]mNOO rhcޱ;r)$>sz {&nY0y5>-$TaOL*8Du}>@?umv(A);U>ĝyZ=Ν>7"mM-%Ȫ+αAˆ#LL/cߨ\I\ւ?-*$~1n(ϫ4t&?ֶvq ?LD4dFAn'(<۩GԦĬrGq_GyqmzUsեK *IVA+/Asv3yN5c2";B°'5-]ɏ=.@4̀$m|ޱǥzDo:%X_bly@N$ۆ;1T0kHA]i_߻C,E_Ɂ@u we3ծ-+,ǍƤ 8,y`)_U=έ2˵ERdklHjʯ]c遴9#L%kؒ! 0gkaoҺdkKb+"!}OsZuՌN(2:LHOz/X>$z8vm§n?˴vj5`5haLTQ4ppꄞ8l}-cYT>+d#^?j-U-9y`0֖D &C7Tw iwnXr~A}%Kv=t*2v 1쌹Qۊ ΉCH!ɭMұ | 휒D[Ph*Nm:hoI l -fz4 YLB{T$C$ {%pRO^Dʹ0mauRe3m)WM_O:HʃڥZi`JqAOږppjU.bR;mBƲĎACP-H-Cp|kkg O},Ŧ4' bt[/:cMώ?4Uw\+SqZWڷw[YmXh= tTRZN chYh,OV5Whdw,x{ݨO&`I^`hҐy4l|^6-pt\>Er9mKX&>j`[r>ӂETZIA9~>34Q~MkHl0HCϗ`rc~I x?4oďNBE?/^`n݅$}o}t)Eh𭾸!<}ҹGBmj80惐٫Iw5)8!) )I ly4uݘ hXD &ģnu4v)VXP1%qI皅qt %6!c5-B3h##nYݔyZTXr8NJvE%AY}CRG+4#X8oHBll~5ZΡ%0ć;"ZFpIٱUؠ2YR> ,ܶzn`1OsZ Ug0,sP>/!=A/xԛs*tۀh*6+6~{^}ǁ^/GPm} ?5#vJ~*,qOȠG `j37|7)$M2;v4!mMV i éS'=ֆ0{ps,0j7"}~F=GVJEpo;8X&cհz(I''gh'"Yⓔ۹r3S2\q `A$:֑F{]W6G|Dw+9҃# 5xpIO 1嵲;w/u$TWRA1 y8(s J۵Z6&R_ wb89O~1n~Mz5#daV/Z1׾{ǧ3f8?D ",*b'ڙ1恹4Pޤ?p+'6Vӗ^`8!kR\~rۼ(<])by>єE';qW׶I#=(Re+{wl>w-5>XEʪǜoۏ:r ٽ$⪺)9q :F1𪹥u}m?*h W=O!> d|֓\TѴA*UOTjr̪[>b dgeQHI!>+Ka︰%;a4זI69y"=]ާMQՠGzjY<%!ASG69י\-ph= OBYfccڙ:"eFXk{ FI^ 9Ewb&MZ_V,Y7b%sNmm7\Yi\aa /G-bFGz6H \4ޔALpLӥt8. "J 6VxϏ]n![`"PλgOFps^Ķ:k$$ WB ,u1c.mfnT*޽:aLb8S^UL]X9Œvk-XIpr/5yhcaTTM@4YZ*TՍ+\u{D@sP׫M0'Y}QԆe"Яax{A?Rk@ޣy3TXvo9Ey eQ}ѷd q x5 svpku#yBA'+.t28'լ "/ gIX¨+<םX OY0GϚT}HLo\s*d #g P{r^4)2d][~{Vv.#doq41LwA"Ux`Y˛t뫇u*iwm%FUVt@fE6h䕚bS=o[ >sZ+H[. ˫)/k@k-N'7]I3@V8$V[NQPh" Uf3¯>( },lg\_̭Jcх#Pg3"±U8ҺR #1C֠ԑ:şw^zzDdug3guaQ5kxehW=0.5On.ڣ]钐@Ti"ۓk{gk'h(5e.adOkmlc''H{y感W|KTc?pX(aoa#(aբ*!6F'C g|o F-!%#W\ JϞh.x&R~MTkYogo]`'ꋅeB=yP1DOF$7('Z$rc=9琢cܦO) |򵤂{6 j70=r1*xZ]ΧGfdsZ)#U6G}uP9>ZLiz~5yh0ґO N#?aY{R[o\WZ;tȴ>|`Pbk"=kzB$P"Y4 wduM@[L솁W\ ϟ;Ud633bÌƛp"l{WZ;X;Lc 8VZT\_ASvȬqwмv\n>Eg:b)X4]C 'BיV^xkUKة='í1Bm#N+/!2j 3j +9fZ{v׌6/kbTSIV0%?>+hmNᏟuDi-lLׂD pP4i.gi&N97* 8"p(LQ Gǚ ȑ nkhW]g /1@횬+uI"|טGg:h%E+T3ldH5In#C[ˍv$ҋl=u23J@{4֩k6ٻTASէe$cڦ[C%Im[9 O~MsZt䴻gC(x9ܣWj}Mw&}!d֪-`rH@#Sn/ `QuH02x @{ՓikF|j X- L/NV"uQ“ޭ#90yT]VS s4ubsM=rJREٷU _w4Q4NAk]4 7gеjvϏ5]gig=X[p*EKշDqjDBipޢjeLeg 5 "Hj'[a=ꨧ8ѼpNk GȀC`Nr fJ;k@ c;xn$4zV䀘_'Vc V&|~vcKbXx ]\F =u^m,s5ҵ+ Oi8,fRTqT2kql8^&_UiȲ8E^jb!^b2Dأ$ףC8%O~qi pH'Q z>qfFS84vWH&HbPvIbU3#|ԹϽyFor݆((:ͦ$as/D0Xz;9,)]Ua?<t8NJѬA+*l9n6fl BCq q|IxA[[:r ^|.}D0\c޻si eZdgey4|ɴ.xZ1aI%pmv'.%CsRk4\P`45פHNx?ַwZqXIc(TOޫrnn&0g_Y\+<YWM@n1cVaxOp'ﺍm5Tb=Qێ6.đ₂7n@ghfkrќ-ۼL$a6 *X#*7+Sle#!G >54w',+1-,Fc9T #2Y衸o 7ڗsUMEfK mZ\tl(<nn# (-th;vr}^iskB6觾$7L>1 ,ǒ.۾k{ehϚtGNYjr\)gZv$FFFkʯzum:eZN&1ыjrj3&>C_h:SBG W~kz(S_jNeAH5ZtE %H~hz< ov)5vͬ&K Q4&oeS1Ogof7.2 ~["7Olԃn[qZ+ Y.x&5 [QceH15umH aA V[+]foe$YID(9oe$$dZqP7Z匑d*ͯ%r TDB@̺1vXOYIVuۆ`*=7R,@ZJ!y jw"ǹMVuoIID/nPd5=e'[ݒ)2GWuPm hE`=dȪ=z'k̇M/l+~i26 nl-]&{XozDU߽Ka[xƹoGq0BvR2H5k_okW&m&Xxaڳ:ջ A *.3NJDr =8^OC+0aPZA gh+,_Uߧ5~k]@@Hn3opĽZM_]z _S޶k;޵:Y(Eny$Ql]LP+SkLr*|rVeR]No-CR+RK}xW_ugnH Yk^TB[#yMsHL@84$V# tN;ˆm"mq|5,]5h%Y*ڟ2,BI. pGy4.x$c=AcL"S .dXAc#A[hs],;< .ҧO>cj5[D&ϞS5&%;zs7Rm%:(o޵ṯ-E@omVz f$P.g5cm눊eoH ƨ{m4[]dfoRTQۥ$1k`:Z5Q<^, r1VM \SAKc,Y*@km!mt4f%88SWhǩoceR?jv!G1922F=}Ix<%W8hM{xլ**78VF ÎkMa(P]irsB҂w`k#7T,F#Ɔm`@=g7>ykQaj'7 i}! _x9\ZNAq*P WK`n#`w>3STgΐOȬ.9 viX_CR5[ukL{9t\as&ݢPN-*.ern;X59fɭDyDK Y'f6m&vs^i]7#꘽p(<5#!@qZIOM~I翂+ 5N*I9V˪-Զ:*8 %[im rK皨fh#0wiaT(PTfuMb:z"D&PHsۛ䲂.J*8tm;OZdqK KS3W4v R6E'* pp( M9"?TAj-\ږ x^DDb $d93indFP Uf#ȏ #H(ƒ~ͿI;09GIJ?kwJ.i PȡOn b>4C#?imE;٠-/4iq4j.0 9d{cLQyy \JASNYfaDHZsǃ1e˸(9?z@- A䊇:DނAȥ`K`;RգOlj 6ܠOS6(ڣ>i< >iyDl;g$DPf\dTc+n(FYL恷\oК\<68G]/;r&bGlf=bkI!c#5KsmcɬX^鉣<L섟{1\pGS*3qAUɐ[A1.|S #6Qh%sTiZrbJw)Èla`[}QZ+E GBq}OpOv N;k1D$c:dZz2Hț8 T}LǢSBAeA%bq !u%f[qyA#.$eLG,k%վڅd_~GK;HgEAVzF,}(H|i2V0i+*9*[9w&rA*CsZC$L`Mɧ[ EH]Yچ` gSەQAHd$;GhRGA詌EJX↉%GA\v֌MAa4,`BH["QF ڭԹfSq6sA] Sbdcl yK avCx^0SEJ2Sz@H"U$>(%s K6F$فړ!7i6gMW\Α2V+aCX­CDM)=5S2ʜj\N 6;. PM"Y<> BU`Ըܾ(I( 9WBU|3\ c,IV ]]oMʻ@(1rj ?}9Xn*gv۞)4  1 r+n\E Ti!)p E;gnitC?zZ'WA WNEazͤsr'OmzYNњLrTq ɒ{SiI9r| }$=5c$*q@ԫ2Dک|S{}2y,1j4VGo mF16` AcsA}W2&lZHL8qk@N 1*{![A0sPcpX!\rkS]>IBStffIf`r,UUB)>,P4-H#UM;TJAZptRHgPCQ+iQY嶆gf1Z@M ypV{娽H!}>*uȣƿu+iK óHppNK֌9߁h\nocǹˋhZzi7mWiѼnx \ :>6;_&*K8R.t]Ԓ|AK-c Y+K#=C~{TF'_Ps~՚*91˦;e؂NN[{}.Q`ہNGǍA 6UE2ǻt礒-hsPNl8(#"rx7w_WQg7>5kaa;q?lӂq2U(SB+v(%2 c(e #EdM2G@ ec^K]N4?2B滾7)b٘mm~V99U"g Hټzdf<ڵ6;sD۱\;PYuI`㹪溎W2Ef}0M8̭h{]:- >~3@نiI#sd[g$5ԞSK lgcAap[Z8UP쾗DĬRсyoT7W>UשtaBiɠFʁw'^g͌٢睾kuM DU׿e/r Hܝ} JӼW TBh[z& ȩ0#/3Nll5[qE{l5iG>ԢS M<[ ̀CH@Ì]􃧸ƒ?Y*f dDǃ[Vɻsڴ?s1hqu RƹHiǚ;Chzi ~*KGRw?\|fI)p14VDԵ@>]ɭY,zIn2[H^~! QEZ5ڃAm%q%r[ VR 0^N'fjw!,ђqOtۨW-FOFKqF8EhcȮ"O<ҝT1&o3B%d#)4qi5VM\ cTĺdxɠݳ4NyV o^\#$'"e'AFh,nuɰgEfzO$QԵib0"K[{[`JAE-'v: }şo3XBHp c"Nݷq(1xYebqE h6Йᑑkv:x+UbrqNij=Qb?ڃA %ަldhcJ$#OU 4Mr{;hcHxU_|\浖)lTh*ouѤz~%]R7B@Ijza%).]iIb w4H^\D5Z'H.*}4H5vB 6 f HUVToN-]b,Pc/7JGnȠ+5Q%AWp+BTqǚh+&#J5"pO yĂ0({7{|ya3@ 'vc3icnTZjOY9A`1;K)E2H>xb|@D ںd"z[,犑]n_h5ñN`2IIKr6@;;E*Aj8&fKhqsA (E$Kiĸt`}1JQ˴qԩFj,T1<]W={S-0Aȩvp2dCI0 z`5eP`$'er9Wfȩ*FHTYo)B'YdkxIɹv;ua>d>a(pN5ȡ ;{K™^`?. rlU$u)d)ǩAyM0r H^Os^ƣlN9sⷒ`1==fKBbG f &PQA䟊ҺL-,|U-nsJ&H.ya\HE*;O4 0 [mGsA\rq9Ȉ{ ƶLoi(y=(A3g)h55:MF '*-t쥇&:Va NRi%oR_r #8}'M{Jc5f @񸼑*;T \cPmR^jI=n"íiXo'+Ҵ @vu׆lzKbBv[dTa" $$T,EH^GڠE#Ju$w'ǻ0FTQb sHkbg847zaS^uVb&cCtq恥bS4iFC8774IY<C!H{OVNN"b }_3nڣG4?ArYO?7_$vLH#UWL _euI5ԼvlzEkՊ+8Eͣyϊ"b?Aaa"16P&iDv9Uq {4hx>|)PRchwq<椦_45*1ȩ"( ^ǣ40-HQj6ZzsfCs)Q3jNXoR5*^ۡ*y#51kQ1 (Rxգ{\eZ[5wioqlcC.8&JZz},GsA3Ibm02qP-- dzDtXz ҪO 4v}aJpC S$k2f^&FchTZ 1o=.Qhڣ=l Ɖr>*M*9 r|a['ykE2*M:8_AQO˦_:`厙 ۆ V f^jlN_A2` PDt*lQ10Pjq2 ; H]EL d/9-Csm=JB8( ԑ'Uiu2 `*Gkl>s@NX;x@1 cm(6Z> 9 ԮJĉpYX6ۊYَѐU'i q慎Y܌W3Ǩot_̑'fih'E3H,gZp}(9$q~|mdd]\c\^4 "Ip䢐HKXN*Hb0"(Euv =̻ JQv&Ge+XHwM3lϊ~(YXS]h)Y gVV/:##!YGgɐ.9bnBXk]CnW Gp)LHQK0%>bvȨVV@$Agk""l˟Ul€XvAU 7=咭lzV1&dž# Ǿh=:ţ@on˴rc< ŢoCqTZ,RiLՠ;o3\ $j2E4@j,Jjk7;(I+X٣*@޳ryjn{ _#4\z002@֭,"%cfZNJr4p*^giN`Wp0}˚cJI;q(+JHEf`Bֳ@ ܨUG}qٽڝSK+c`2$I]Y5k`b%m3/&Ϭ N@H{{ӌ.ܮ>MS24/j=VʞU(ݐy5(*``pN;U]J}F(NO_onI4RH.$Hr*Hbzӓs3rewY佩/~ةphS+f˃xwa!$?~h!uTS>ox.Ρ=Ձ@ȯEncbA>):P+**j2܂n @Ly}0wpcs+UUXs9!G_X9 VPs>ivщ!i'- X N ""@Tں,Irƹ|gq8 8"HT}qOGoߚf!Sc'A5̏LO1xCyD)q<8ۊMpyd愶#CHe4r >*@YƐ5ֱod<}*6]~F05kjYeݎQ7p#4oObTj}yy jZp>jӥ-D#iq悦 VXfvQ. [[%0oxSiL)&;N8˭(6ý$=mCu % a5: رsA#vk!u3܎sLCf6ePv93 r?|}^M^2_ HoJ o OƂk6<Қ `N'vrOziT Wz#«yJ(rʸqO+m@Lu`Olic)'qЕHM\ co PD6rGqLp~-$I'|(#:!+A*3nBnNHA ݍPC#p(Eu"ڡG)J=#,(2ӱȱB}UR\J5UBpN1 U*D:yU}9=IM[3 g!sZdr315dah k: e'njHf^,;3qy A:f }riqR`qVK  \U&IbcUكd殒-rڠ%OYcOq EP&I3XYJ챵*It$SDeyPI ޤJE(JR98ۣ4j (#dRٛkYn,ݏtcWfime+CeCJI >h*Z 3p?5Zv88&7rb"qldFH xQvtq85`.hq<5%,T' UVvK?֮mͪcTڢKG2x4нR@sAlR00*tUi7XY)*ʻ(w4"{Fk o }R%PO>abXLF"nW4Ҫ2O7FVH!A kɤIr}p<щ\p|qAց$$~ƒwK%d9q=q@1o{0cF0Ci{ǎ M8pi39fK#lo!$VH r;B4_fT4heœyj@Ź; 8➆ XӨj6D2 ~I+ ǕAeFja#7qR9Cpib`N( {N)Ij. c YmD#$[q@ 8JP|b2G r~iS4b\F;HA=.$>ܨ}ld@2@6?A j4Jc pz3&HSJP@J3A ݅R?S+w*W}yVés9P|WIY%$|PE/*2MM 5-5|fрQG ?ӛ` =rT;fyb_>6+nԸ",QT"$ xG$F usmިNqM,n5 X<׌2G[Y'axjQU!Yʅ}G.->TV8S!@`1ޣ\zLNs(y#*Y-5,\=Gjl<Q@枲UK;ڡ?-HP %_D"%kG>qy8S@GmG]I3Kf͈ioVgM{8jv{jiءVeބh)-AʅRcdN`4 y4ͫ,I$MN ׷PFOA8O9N)!Fh9Eڿܕ,<7*A9v![sLc>U+Q||T9%y{ R^" 0|D+o4H3'=wNSQœzNIvT-b2h" <[Ԏ@OuO1ǐ@E+}#Ef!L6 /?&:®B/?"1 lPK( \Ń#{SA18A1ngqڸY=5PN3[fǩ!8=m-A= sDFT*2s4 '!2ṅ~8 XAt@@p߷Ue<P1>޾ knۃ0⸏kA?lJrϵ.av*,۔giSH=BG䛖b<ӑ ?54"DHr|@y$l@9LU98S n⃲Q\d][9IHޝڑpWVYw*GO߃P?.r{ShܓHbNf_O1ǁ)&I2*c1i,Qx_RdnvzxS$I< 수_]7!>y] $k=*++; wC3& j$٥B0\p$ ?K#m]|WGHkFe5q)۴)P%?mIxIOށ9;;<q,Hf4Q;6XajBێ9*M$d|2T )AfbH 1:ڿjсo9Ԍ T82IxY.q\Q.!dMMmpGʮ@'+܀"sނ.$9U⥦P}4ȠxiW`@4Du#QVϚko 2n,yIHelq7H_p1ڥ |˅8PaF}e7rþjpۀqi>'aKȷȩ M)"},q@Ɂc\ %g~1@! UwlDq#"`ņK%h>E!vGǏ0TO: ۊN=2|҅6jA !݁¯4a*1v<x*w|WaTy9NFGO/5/;F$8Zn$S*C*2j3Y9E;g՛,C 1\&Ggi 6q1Jۻcq?sXHy*)^y&-q,ڦ,`@0n1AJ&8\13,|TDvAxl;NF %F>1Ϛ(!0pGJAaOzrKp)ŅTMX-nr<ӉlUrjV܌K#;G>(# |SGpr 9*F1]ل@ɅY#G!e}X1D.O;:ɧ J،`|h=ɦD%Kqf\#S]ID3F <=uI v⁚!ps& ı#m?,Dݣ^>i\\03FE9Aϑ]SUS1c!8#@`B3j!HU>R9)T4{Mr3Gn̿G#8|8 K lCj?mȫO<_%mHAH>jZHXln7!c$8Dr$}Wh'F%y0ES,Ws8LG9)%$ K*Opi(''z$[>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH pHYs  ~tIME  KIDATxe;e!c1Y#!6cLmB7Ab BLAu)u:ssUU>rv[8HGlyPUl<RJtu鶇% <8evHG#\ KfY-1˂nN~V=V&@\'˳]n 7=H_"OI<)w`) ;ޟ/xo<^pslcҭ~ @BL>ܐLn w={;aV P(ݸG'sn 7;VP>>|,1i'nNw.CnπXmN>|2/ӍIw.Ct;(#@|.lতTNsα{u ("'B$J7'bo;<&&%@ |-jSmp;c,] 6[w. wJ|#int9Ct(@! G갖;wo'77鶷;:W(v{m[cKJN\nNwx}ҝc/(@!$;wI j[|wKnN7s{{Xϓ%? cݶ} 5IПc<] 6v2ESfiV9z|(@W]A |h{簋}|=Np(ϝ;̙/ݡ C/Ep37bo(@`[wƭ j:Ǥ+@w'psg?C^1{kg˟?% Zps(uLL/] P<{_$1ܜn wt^콷N{+\ 6k7tcSbIw.{{v P!-J#Y=>boo|αX/iӍIw.{{bou+@nN*i&L`(@t[&_p{]>_bZ9ߋֹ.DH?ߋ=u  pC`jg@ fy p cx( RdC dC-WLD̐)%@J R)%@J RG?@ZxCZKU&@J RK?֭5 ~X<fۙ!8>!ބtP]tbcV4IרLP)bɠKǸ⡃y⥫H^GdpsY'Tu+>*a-@GF:gEIK` ';vpc[=U;`YG&Pz^Pz^Pz^Pz^Pz^Pz^Pz^'A$:FiTWWWWWWWWWWWWWLDqj5>eccBke< &okhL|4.;fKdY m& qnA?3`D❵VH208՚f,zr@VUl9?T&x;WG;TUѬWi/dPhCB*ɜF4;.YpG;VWLGj: ¶(ʎ& U{[s2TAh2h7AWk7Y `\u;ՅD\[9j:Ų7b@ɍ|75-Ј78;D0hV7t֒&VlOΝ?Fј$$~"0\E<UcX.:o]PGrqW<A|Cw\k:r0F6x Z EeJ~8r9#柎OCo"[Up T̖KxSnLsY{Kl*)4[#ʮxcW(8yԣdr"V֣L`e$SkhHc=Pv72\I6bs>rn94WOi7 QPfBW6g@[Ii\ W vYvѠN"$=lsA"<i@Ʋޟ`m8mPL.v1MI]S jHZ

;{Hc\.B|fO<~ⶩ8==c=y?5̰=ݨD6ln3Rœ(טM'麐zϨ7.{ c 8ehVJ+P^ꋖe'"T!GE;ʩ⥨9)yހ 9cyppr?T~GBsFIP<*I˜9?-A]zFa[*"'j|h3A^}%e|H`e\ՒQKPCZlG꫽3_G2o@2 vwS6Nu e\튗eԩ4%3wWdz9#9ήo`{C]z^z^z^z^z^z^z^z^: <2OT#"0L`sވ@"Wy$d:0׶A&,+1 KYTi6dMO UE\tB9YMV UHP AOS Q5%aF@U<{X⭖+[z ~*٥V[/mK}H^Ek8J:G#43QX_-ߗSVBQE(iCV~h[b# \@nfUCԃMAn֡5v#HÆ~ieq9C只GcFl?'nV$NM^?}>W@uf]ju[,aN;Ris'#?q@ZU]KAՕ _C-;ܚ % KP;C"ٶ k=kQʑAT),i\ 7C4K(%SjIcjYJyYFȬܗdM,o39AvL֖6+9Q3KT{U^;IUOi) ҃H\n}[ܙ"dF-mR!b5-#Pۓx-fP9d(I=f%ʂ q28мVz]3<ԏQb  :Tv?Y@|Ƨ$sϚ scܝr-{Tx(¶hV6v'/1Sa|滛Y.]$R$pEX+Pެ,QAљ>Vketlh5K XrߥYc<`YƝ|4}]XqQ?sdj6PijЮvRyUM)C=a@5H1*UT#ɍ=WVטg U9[A" "ys7GVZ`QWދi6[5Gu' ~H222wɠ#׉%~(U2&p2chgHOb4c#w4r $vY{]:xGF~k ꋧ`Sޫ3~kS:RdRՆk2zzGo4[cUqLpGA`Twn Hjqz r"RB0`KAisRx=Eb1C[xA[`5Ҳ < }~)b;w*Vgj>3jZZ$ {I4Z !Yd8~ !,Xڤ6:˰{S0Y@Vr/TƀuM68(.ZdHHm`j'QZ{~;, q"V(Ωy8_s@GR8UKC @}3񶆳y4`"HȐ@R]y0]zDm9ʻ$^Nk_(UU!"` cS*O(7{ǭPCž(D<5\褣qx7(]qH}4'B̻Fpkݢ;eT1MĠ̫ VLϹ 58P9- D$T=x! T@O9ދJcL^Y$?m:0Ux8jZW$52mSIX㌮iIq~j; qA["VJ8p^&xޣ9 qpŶIdȻ{23m$~JRPOjjAU9$&*\BAv4qɟ~S#\x1*q^=dX7ZfwJsA<$pvd_*ZMf!D\z|}a!5)wpϊ=C|o 1 *ߔHP_4Aj V :ed\sQV%ݐhh+vz<`IpWRHծb+XPhMcTH9MwYhu`H;(,։+4`oi_sqcwcVk(^+xƫPTmPfH.`_ 0b=LeϊN`u 6hPT~P XLFvSaE ,3 X&tH8oY!ldDbY#L֖cT_*2GlZİ1X~nY~f(Lhc5%,Ь~gcFyܞ3ފ"?hZi 4w<J~S$ \#sjFClǜm@Z;oo66棈v D{x0EzTcFʊKtaIzxj6{SaHf]"_=3) n1@2F >f1@`+Gh2V)'+sSvR8hSn(I 7 sZAzpGv`ۈ*b6.E!GMUP=4͕᱆\d+OڼIrOqA*&L|)cqBOPHoր;̤H?4X o,QS׵Z_#=zŽVdT"]2zO)_iYoY jTC%¾8?zrCzȣlr 62{jI.!B2(#4|U&fr[ot \ŋ>*wnnA)t讦blY ԟW7kR$ڛF;Fp4^$-Btkdd Uz8X j"zs<Ñ #w njʍmqL{So3A,xᖾx5@r8k{ݯlVkR 2h-݈hY.#a;m|W .j]n|hmvۜf`cB6%mc &l1?j~Pgc}5ȠxYj,Oom,9>)YَA^Y}4<∥0 J[]k֖qL}V(=Esx}8UKv+`sE2DZF*q `FN8TIR[Eʼn(;}p%4W_GIzp(,v((ݸUpy؟5:80c+֦fd 楋6#sd~s@ v9$}@#C-B~QNR,y惆i}̈́_&nj&e'o֙yBBkq9JG7 OcE;p<ҠO4BpjuٹÊow*{oRV EnZ|tG3vI755  d.;0ѳ Vj@(A'FNRleWP88.N޸ZwCH 0j,oHpOMQAdcs8:33\DŽ To:VɽwnwP]弶~XRw sMJI4{'u%rB5'VVO(Csz\qZh9wcAuԺ><^*:YI ~:8vH;4O@M۪ʌNX /{tObS$.ЪHc({uUP9EVzcYPuDhL  .RQY̦wrIEZeqH#ou, *lu޸ }Q)+%'Pkݰ˜G@y-i@HgE"`w4m-O g☷L4Qԍj=,1û 9h]+b(>$6⨸h*Ekzr[8ڰ@zJ9݇Ad ajr"F@ K-̋FmvA`z P2*}Oe)y$lHS` 惂7Wv(ݏn,00mLH,gq+Ђ*S'Ӂ{:3V#CZCJY|OGǴ9Lb$TԒr%_S恡L~^]mHTP;$\$sWǚUг1_҄DfvR-n34,ޘnP8}GMbW}AQa\(ɶOqqALB>a}@Qq9BԲc+qRbWRdP(~<,[)lWHs+nSPGBP `xRjkN$-Zt# %*r{ qZ}8G1@E<.wyTB ;ј(#D9#9h?DGy;U*{P06 <И s%4RsrLNh:.-=@T|r\ʮ{b+u?([{mh#zӦ\&o˧#19v6#w ao!_N6raQ(,v1 8@mƊ*N㓜.9%GH+NȒ)nm`!aҘE4pPNqsS$ `)\K;mk2xO$2o"mvr5P{ć kp֖kk+\ga7'-ހmԷJC)8a 9lg\IM"ݻn X;rq-WaP[L[Sq^16L>s@*(4GLpSPazH=X1xK${V~=(8>kll+779怵֥!@W榥n!rp{ki'zO?2 ~k{[EYwc"y#YDa\#SǞ9!XOz${*0Ip=qR;XY2L;};DݩS~ms !; WAoq2УHQQ⚈o̓۽J9Y`sǚp&D'McrqޤBїs@ˁ[H)]$FktsR&(#G]G 62#koQdv6 ~3#Dz*\zJ#^b8'P^zL]/IE^GXCkZ#/yPN19*NF'm;Hd,y*Ka/9,Opf1[p 1A54d*H9g#vC2]"hAP%rj:t&)f!Er byDqHX?T. r>jttG cL!L6=#>UJ; /\đCP֬`; !6U+H`nZFcڤ~qM0Oj`yp+ֺUX)FqD"Wԏ94k@s)!_ :t#Ib8ɣzjv#PfnU_y≕P>sPph*v y AX]]H5`A6ݳ0GNdm^ D+vmm_\g;*\S[e-'7H[+Lg<ާ30~)OCA#,PuMr-.f`h$ {Ely[>*{uwnI9T'.i.&*meQI@hؑ~P@vXo#QcR7v0N1ܢ^P6o4H_ށtOkQ? R#)兢>HH=!IѰzDW>ip!XPr~ۋP3A&Wޖ$;fS ^PGK3`r((J2)@' ']0ju4U_ YtDn1>*ߢK6f m#5Fy0ǰKLT=Ap/!C3i/ u[47&`3@R8fQ<2=ˏI*-I+=vw SPd>kdW^8m(8[ݻ#Ee&5N9wq1Z-|Pt?uRԠPy[&*kI=~Jc8&(by4mV4 .U09ibnC1AlH4n9Q$QY 1h92GLs>E2!uwv5:OB`l;젇y 24b&30Ttx-Xtnd\>vEw76{f3˽|4FKr9 IM/r#!HP5d zh2j]k(GXcZt۴!E_ PnSLHR#+|PHN6[#o T.Eu9!Y.d!@GOV5d9]2ώTPzWXnXmݰea\tfV% 0_?&.!`l'# ө% #=#-NEnRp2{R4P{yjשZ&$6He÷zx4qZGAZGOs*$nTY@(H*j|3ݩݼh3& p@/*r[Kyce'OK=M ܇kֆGf Ը}%$f "RNjp6,j)dxu֧{IwcVfI;=\k'2 7$S ~” Bԍ}_=jYib@ff81GrMH70Kcgqǚmʪ&ǹ{ POӻ1(8slg5.4px9K `@ґmS"q$L^iph&]O5n{.)!1UU&HKEAwibњAsR4[>(alf@&(caMi#Jgn8悑e=XFYJ8! X~Xf?x4b$>L\6k"ȮKR2(fpKz$2HB` Zi)g<]}G cEU-n/j*[3sW=F .,乓Nz :tH񭄠yYĖ}6ŷ4~@홴=33Ղ‰ mm%IZ [6fx&Fd  *X,\5 '|"$cv&@AL`(l r*ӝ<(\Fh揠)MCQlma@7SMgLw@4V]mYTd=+LKA E;Nrh*zBD ML QO Vʷ_E85k4N 21A6đ"[I8VY`u.ýuM2ǑI9̞8mH~&8U <-kp&$B"[^F*dq[RNE( <+-D#GV#G$&$xbOQqS f)%XF6%f\~(ME ݬFb7;DҲ#?ngNY Y@SVWW%F1NmJHl,(WgP0z%e>MVNl\s6-jEn[x"'5O)Xlka⃛+)?SRjP[(Mηīp>fk-IXy$RXl+sC~{I#U9[.97O8huRvMS&k5oqJ[ԙD w#c !@ "Q 3N׊Z"Fo oh.LGS%=ßVke .'\g{5Uqh5{ẍoZuӞC1,qTBu;d19jwkXԅv'87ZDF<ޝSlm(VzhS&T3K yaY03Aiqo#Eac<Ӊ*L\=Vt_qzr;i~hAKQ4˖ !qƙr\ 2n[j1x#n4l^4MrG\ F;V40t͹c&қLJƒ8ɠ+j!r|C\O4y%W4>NFB×zͭDs S>l'앭tOy:m#jڥ=п+̗S`iz4sX˳h֋%.@~Q!%"&E7=X2#g {v^uhi.0|Խ:+ mv]G?}^.^(,r|V[-4g-# 3ϚwSv^yTTKU%LdP; $,OY- GBLs@#`3ډBND!ŲGh7!dB w,pN7 7Iz#֗^8[5W$dH %V=BA&6cHMZ;qrOdSPogq,A3Ptx-$\Ā[ Gծt"Ǔ]V=;u@/f#_tIkhHhh)Iܱ|)LŃEÃjiYÜz d"v$txIhK  i#Pe?a8-Dsݰqѵ{!Ge*',{sS-(| o?s(%A`<ԨDy*2n9BHBO*|PIY8ȧܹv9)HR05LAP;SֶwQf 'N67|Puu {d UI2sb PEJinnSF]a@ַmǐM/Yy0D#⬚ө蝈(c$p VUBy!ױC ƫgN۠oDn˻aO޳'u3jરP}CKdUۦKཌྷp U-ux&C`#9=-fnȹ@4#E*>F@х `mWmhg3[''yPI?+'i5.e9"eܟLciDח~8]G/Qǰ 朂f'x|P ׵I4 9 [I_\LLlp*u5M')擣[XHb#װ[B=N 0B>CHCb;T[6qG-h+ͯrAnU🆑ey.0@O'TnǦwY ]݅p\tN CzN +sNZN "njߥI畣j`Ssܣ?D]B;r@;C5!Ge6}Yl cgk;뚮WiB\4X"BjФ:mT(j:gLۖqz}5p-?殺L@骜%_USg(/6˧ $? +ynG,AYc-Og*~ԘWsjl!/*џQ4]0~h+Z=Im{t9UUgMmm/ <6Q5N}FmR7QjT>o%-jEi209pjA}P&kel +7Oi͋i%bΤ怾alaG(loާ}"ZMk=Үm&!LUN;c]J $1#i*tlC:/ڥ< L?1NDdՈ ?4I$v\-'O^JÀ5Z 2BY:OVX315b$G(6@!;weRX"E9x0@'2iþrhPz(Vn9<} X+m c/q #{MQԶsP)VJ,[Ia~ƀ~[}10GڜCf_DbR`8;F޴gޱ25귉ZE2.HUO\<`hԵ፠w#4mSSԸb#qӚvguS>>k@hܲ(A@2JL#IqrP {z!fHϬ3hTnlA7Xine0كݪiZ"# cFtޛjy 5w$UɁ\Uo]#ޡUދMc#I6s/R0Mdg"twJ3`$x8h.F~DA<vEt% xd?Bn'c] q xA|r^=v,(uilJ5 [ZE8'h֊331@mVVlGlޫyY vy2oLH 95X{0Н/R\\ An]^iJfX\nܓTzu1rA.Zb[ XHCq*O?jgʅM/>DdҐ2[4 j6oeqR}9qV>jYVWi/LKIFQ!f#=櫶ɠjgT ;c恔bGġYkqp[TFxm8\jvװNsaԴxm̵K^MԮbE1QegG)8bEwY 4rUg\<2Ah{9]}]B@ݽ&vYLvgaz?l䰞>F99e[NB?:^]h;ISs-."9a= Z9 Xl4IM2;*f3Ad҉[?L8Vq'hM]ڡ%+EXJ[+?njoڬ.B11u3ck 7 ~@'P>1}ޡ#ʱ"FNYԜs\X  {cPM?xz}EU׺6'PB:>٤. Xcx[>` {]Ť#DHnT+߰j2ʞ>`7c@OPc[Z>Uzin 0'KiERy$B{Em{cV m.l{Hf,oq %@T y.HϵG4& >Tc*j:z4* gn0ˎ('G廷h"4Os%cMWʽ4 mL\IG,UlU?%ݥ6Q@뫮.݊%7|VAh 56Q&SDd;s͈74ͮπS<)h˨(֑ds<SڿLV@zh[#$=&+\U+D]>bX?MPh0@A&#q=cNGշ޶O J&/s;/u7ŗ{(A*=Ug[.{۪r;KX'.n̑1GcKoR}.W,Pȕ&8e\PjmdYNzrG(E-A#9?žx~";O8Vt>aVFpOz6?sM0'gb&I+d%c=ż7rmXƒȲL9f^;29?&Qo^$DR+$#"W>M-mTab1qU]:B ػhb?QV4ư2ً %gA>*`"b1rGڀ͓HfPrMCLwHSqFHXA7Esjx#Pp/R-pQ qOn8I8R#QC杚i"vGH9xrJET^5&6!qS֯m4ޅR_W(Q!,ͣ) `Iٴn8fK(YC*/!Z-?6:-94gHSX 68rr`# i9ih t&P9D{P@Ӵ " U<@I~+'`(2X55ĈGEHjg-o][`cvƽ1hi?(GҢ9Ri s]ǠXuV}cGK؉t7\tV^*F S $rXбBZ'> }O-63Jc/SKc,L E&(2sRzoO!₣OJY=NF᥻fFǁޫ}Oq: :~+]p{G K+5F +TӛRꇺo92E]:Myd0|P^cԔH]WE_[v)Cmng`c mש3Hw|PL"LpHܚVޡa@%eb.S7m'i< [q"?vEǑ\ڢ_nglSj:$3e`gҼgݲMBFf@@q8jZvQdO2 S#M0y)lOlbvMofc=fS?k!lS޹O4, d0=gݜrj˥@MҸ ^URwBV\p&!2*4" w1Y[w+-ROILР jSd 2x9fmU pjZBru)ˋ }*,>,#P d&2sϚɩX]ND/MF?~m.+ht Yr|ƣgtB}Ol8\[Z2IK1TGl Q=>1u-j PjVKECYqT 5k+䄲)8޾̇ڋ4x<5Jܔp8:TW[qɂN*.kju{ {<ў^KJh4M.\Nj.x=ciH-PPw\}6;H&~tO}|ͩ^l P{H̪7'jSۊGe\ 䊇 󋸏`}-PF ףs$l{mB(L1{5hb˴1'G*dR{C@}@=v(?ԗVc P:[YwrYǦYŨfC]?q '[ ڪ_Qhf?vD UdT@C-1( /oP]+Л1"&wsSzRlz }&/SkJm 4,O4ibkpܚ=+mEl\Zad{f$o?F;y4;6| xoĺӉبnsD{-# 8D׵&JD*ԍܙvOn"N@ nk'7w'~+ j n75ķ" SJxQu:+L*0m5;A~w4?O >XErӱU AYi2 *zΰxJaCy3"۴O28X-:LVvѯ1M# u "0$Vb+EkpI`~6}g6`pϣ6׶Rr^M~h-DqFhǧج#Q0#R=52P<vsIMzrCq:F̤P/R҅Q{ghz(W0$L8?z7 ["AI6cS)@iipDR0Ur沸OP6*ѐ<JAc5zk@یH?Zg/4+ aI*v VFY9a#m5OT|'qoŵC/S+-G`Y|R^/QsQފW9?悓i ~3y3JQ+{\i֬;Zv&9ē5v1P?ڃ9?zQˣ@p@yblS{ӱ~L]8CAGqv\ԟ;a>jl[ߓs)ѣX[yHWbdvPY]?|}%ZV$zӤ{<뚳iѝGx.3ڧEr8Pf1Df.LA!q0Ω{kX78jke $.HU&U@5ol$%|@R hLvOXW0+}l+F?Z&bąh+6]Hac̷l3[#+^-G 9nf<ƍn$S}MNb8\x>>h7sʞsArH_]PshT'Qȣ۴x9˫E4,9ub=GUmZ-KL^?RG18ja%e(2U?j :Nz5K(=,5>Vgv`Cn78 Ni-4B29(.>vU nfƾ(Z董I,sER8Ę>h$]ZHs ź\5xn-+cG$b`Ϸ{v?XI8\@^"r@P2ޞAR-^q*;-;íBEQ3Wdkg|qT^I,}#ķiibj_V4xrcu-ؠHD0G++.!Nb\ANG:_i *?FN,Hg}5AcX ,\Z_ֲ%k4j#4 B)|}qC~ C CDAOÆ 4Ki&O jHc<~ۍ>Nbﺏ]Ciq(e<?A@J*AnVZO"I=T$OѿPFqA5GՆ 㔖԰鱴Glڀ?_`zC':/6͓bPP X=+5KڪqnN*՘ޡkw2gݷ~u.X `|(Ut$kxQj]/Z`4YOGcPz =^2øKcjZk*oIe=dˉ{fcM&ki=Mq-lA^Lч>su+Ȕy5A=[zOo#c5# рNh/:$nBմC"*'C7,YN$A5۪֗\BGpyO=lAUJu5Y\)kEm(h44.~v@ i4HL}l{sX5=JdXێ@[{%g2Q4 i:*bB[0}'V?#%@69wZi׭1B/t=4LvKr}o^Y[48LNҖ^mɠcifI8SUJ{#6$laOH6-'?nM)fDZi\3œ;J_jmtԴך95\,iWv ?=q@0Oj(&2aڧuhPMǞCIT)[-f֕\%uKde'$zF["oshM%AYD0XԑL0O("Hclt-s=Mhun0=U<vݬbydԽ܉mƆs{:&cZv2Xo;犱EԺu#{VoMG,Z&XcMK3$Kc ؒ(5{dd.TmC=3ͷ*BdV]u}jz>*-T^DyொJ7duQ[J A?ZoYtz}B z{Cӿrl7U ԞFr*mn7246m:FY5(q@R,z}4[b%=hmARƉ&b7Ih5 *^7L. |G!F4O6(X黬"`H beV#j(8^}aZU.Xaj|pqRcHrVYP)' ܜT؟mvFD-HU ^?'("[55YjJA%@5h0ʎZ@ۢZ!WGDO)U25c*ױ;v(7/:x P[u<`?c 6F(sqmcɠJ/7Zhnr"U?:z0q#\t֡#kyS;Щ) Q;d;W)xDi(Z?q\c:N #PbIeW*?:%̡_qV17T~tlA{;eϫ]+ 6sƥ۞y5bHVK) m}%t[!A;qAfn:22J&nGڋ~nZ5hL *ȼ7T;4rv "ij,;TQ Bݙvb]CKUHyiy7 .@͟I #3Ff:n?Qn^ɣM T?йzwOWC&|' HE8E #epC!w똤aEaAL]uj"d9WHKBd<p*}Ffh8a* b2ir6Xֱ`)T/vRp= Hl@@qMZjkCǧ޽u}՜( ,rhϡk+o4@'5~XS$L8&3Ol˻ !Z-۠('}*Q92N@ޡYN}ǐIFh 6(F14 ae6Ӓ m28↺Gs,$7 FלQ8n- 8_@V72T&g$*A(r=\B699U):eu{ĕm0 r(#NF8gguImQh&2#@b31o"i^h"';x4-6+K?O4Sd@|`- is"YTۭjMǼ K6]֗z}+NcV\<._c:l0K" AbЯ%][*ԨĒVPxjJ-!9Y6d#B=.GC9y Q_[kk洚BONEmMٔY @!.)/gц{[sVn!| 9SvQN \Bx_5  }՟IHҭҰ9 )mvv "7꥞).Mrߦf6aA,#1'5a DwDk2{u K޳i$9!R ]3YeŮ-YFbdoc.ԊkjrC8%{-VPo0uCKkfUnvHG}m^t `Bǐ HH#˦!Sū?ޡtޫi)Pi A{۸`nY~AhZR=G1/CȠt}^v_NzՒ+YP /%v%wqw:I29Eҥ 37P]vdjj* ,<ԩl<(2\:(ܩ40!QW۫2ϴ YYNHހVt8PN,Noua oL.H(:2j;̀"]g뾝2;GÐLkzJ#X_k~ScF,FBE\,4{FfkYU?ܐ4bYDDՎS, 'xzcm͍GNt {(>lW~R8ڐ&k~[HFrA<⳹J I:ZңI8>qWA{|>-ʁOc1`^\;JP1%Pv0Z%T^[q88bMM5RB/ NZhZɳ1*1>(#b;|)hN枋o4;'|vْ+1@I?% 4 awvj( BNj*"-;J$&B>ժBǯo @07w(aUiƕn[ѓVڽYȂFx*-YĐ0`&Yzl r봖جNѦMD0eBal^C>Pi{SmtUc.XRP|5 Lr $V4a9~>)ݤv-6cFsS4)D?T4bLp)繶= x6*㹩>Aj4̣ے=ao<?ByPh#-=CuH hE۬ ըOy’(#WJ֨1Z.,M{Ai\pjg_UwОlol&=>h2VSrx$Uh젞UVc*[Gbq"F2堩y<$;xT[[Tb OKѴD!hĄ>h Cl 6d/z)Pʏ6QVصK{&{t<X ?n8&%I$ۘ*.>\s[?ؑ[%>h)]D@Nc~⥑ڶL) ѱ).Ȭ4Tt|Fv!;Pv&vOl}>#?h2fFOg;F\in/$f*~qڂZA8icQKKFՍp{ s;k-d嶠@mɆЀ[HJzJaxRJOidXopj=4D')"%Q&汙2+Zl,l2cڧGjzZoRuR\[ٵboW,^iLB>@/#ki1ÿbtNt+-.n\q4Shı @43un#2>6 g#V)DG`rQ̖B-z E+[=QLE@PpYG6LjV-fkXCsU k8Is곤?@Nn%y>iONĴ{;?ݴkV\3CyiUi9PzOՄ1ۓނuGjG]5!Gp=|Iig\ *'UŦF؝yS@a+iP -ay~٩G*lݥ_S=miHjAqٜ>*Yv_seaqNmw=W;A9𛮤{Ikwbc bѥ#Џ q%J)L;NOmX;; 3HS$Py-б`{P+i>1h0zzWYxn+ <'95麕h.m$G#Š;פ$GM$~ ׷|-u0W8|$r) uqmvq#O.!byuh“x6gRIJѧhbq5ҥ;'AuVżV$. Mִx;SҺb}: `x5qG69' ^jf)iQz)@3&4h) pY}E'@vFѤ`;.ӄq(i+*8*+T2dP6U#0Z #8h=SW7p G suu%1څ)y AI.8cB`FI캼q"@D vHc bMa9皋w*ZzXmgF|W\jyu.&f :<0qT}=ܗ%nRtM.^QCl$w;i#;{Yn2є]?UidV\*T }v@s;vdPsH#i#@w@ -jHJ/s\kRMDh28J'܁+Sr(#\reہllx Yb`'%ȭe @*G#xm8'42|PG)g?zLG1))@. ׊s LQU -/HQ=xɷSrB$A5oU{ҌSonRhBsRҽf @4Cg+*2eTsb< &;`<4`G}J9S /ϱAKu)@5-'r"$[Zv#6 %P`]gXhmKb\p:ȁ"F85j:Ly=\\NJTC&Oko1")Ìh>{E6LvQ*ư`=B5%Oe\h3[͖[ rM[ntܓ"!*wMP[Xpd.3Y^SYyAnꎙ%[ *F[~k ù'ڇ-Ҧx@/\xn`;P}Q1Y =LsZGOuz$- 1怨 bs^bf$?@Y ;?NǑ[E`@(!PFNUy, #J7zlVw W}?Bza?myjӥ4;BծQu4DrG޶+wEnbTqDbUg@j L5B7 eŶ"x}03g$[G'`K$vc*2Pv(dY4h d៍Ei q0Rı<ރ+VXcIp8X'O!48-3pKLVԗVHQxK\<ӞEHd8TP̳_6Z{+RbWNXcsUv[5;6UOpi;IQ!D_8=o/n5)$P;xPX[{ s"Тզ}ďD(576ls[m&;kWwrv5B-/ltVw\ԫV'E =ʜ cV7t OaMs4[^h zZݰ|Jh]3\ v5?vDPG&x6L܅.72zj4 wڳ Vtm{ ivI#V>h*nsʙ 3[KuPBB\3mbY 2x47v2MlAp=Rf{ SՄ\*;洭 ѥe#4FJ8d\.{eg Rn<`K;G4 k;S Ga8#Җ Xq$P=^{ {p*ٯG$]Jyjb48p+I}O-HǦbI4Ҕh'F|S.a@0v#vGi*֎I Sk/L]qijJwS_==j;qmV v&Oᮉzs2/ʜP})Hcn2LJYaS @nl;LvLP?ADA82"NMwz۪{Cq@r)I/ L;@rn?Zd{l*6TwR%s@ں(erI.=ӎ) +6 t)c& nzyQFZnp rZK(ϒ( w0y4?d5&Ote {IcX'4w Mi?݊i: 8v!J@R{?ꎉT>;:Kyo Z{Y2#\BSU#pyW5]F'2KzIDpsymk7c4bPwtnbt$U,lXaX#4N{sNs5뜮,ƒeuJXdgkvjݩbu{%>=YjK-L1VzGHեG/tp95zƙ"wTN}[a0\݊/ؚ< Lr) ॎZA-1zkM2FiO''8-6xOؼn]1Z %ǚ/h8i- $sWLI+ݨ<q++,2sO[cOP$HeKej,#E!V Zz- 5߁O9W`>︨iK#6 #Z f7;┓3F1rHK*I֕zf[Kv)1Ѣ~<]@u!ژUEɑ*8FI"'(^.Ih"ϧZF6wPEx{ӊ3Sww*vKĤw8<"&GAFK ԘaKhv)yQ޲F69nK}Oyc)d$`]kLKmޓ|Ӛ|[NL{@· NmmlI繠&H-={EF"kD9lzH ~+S=EIKQPX ޥcxς(Gā$ULFx$rW 3DF!hGP_kk h2N{+}GbajT0I$Ki' ] &pMZMHTh6@ aRD.9v?tkim2~@;Nb8 qA66K|P< ŠK4a=K>0>)G8^\)G<ךG-PIH]1:W~GvBc~U4c[jqo)arxvz6Ƹ aX4*߰s8j*(BLDn@4`zdT}$/UW{R\:WԧW)om"G[+4/R۠Yw*6jIA}.G+[jq8=E[FdI8ɮ[J37vC2.-ԏ8L7F+GɠoPSSCp~aY|;!(IӇ+oC4Zt+ "薬?ڹ:_Do-N%u?]:ϰI# T{)c/4M:+XQӡeqAZza^}[sclϹaa<@{>"I$㢮/PWIoRN>r;\g$m4 iunUϳ&:bIa sWa٢H[x^;-ZFѤ L=*rc9+3CZ>كGz]Ҧف OPAU'F~Ւ[&EUB3kM=L į 5aHqU+< 8n;Q.y I~j@3M3gh$X'y$/(=~~+2F7Ӈpi;On+qn}ڳö5]OeDK]B%_IŽ(~ ef*+N%׿44i,˸k̮q3$r;4,vF,~PIaf?!Wjŕ'4Ƚ -c}~Hr?ޘ[#ul9C< ^0X2wgHaV2 q(PuZ5ՠf9ojn\ 4wR/a?D_ lmL4Xt%}' T"fT3ԢOJ9ڡsSw/&aQRa !;f G(#-KYG<ʹ,r(LRhIXx$j}&P#"2|T87zhs=9Q`n7)qYjB]k<%~3 h49#Sw.0%jA| զW(>4e[3p{Q̄rJY\J7`" 6n?jVwR*{d"Dd\{~u{maIv}<'>ҥ=Vh8JIT~Ή[TB !@ɨŽ(M.#YFzj; 2G$J>Lp)2ǵ̸Sk!B,%9SCu Q%5+,pENTs8V.)W`s"D}12{P#X4EO @u,O% #+Ѧ6#EfvwҽNm^F* 1~g8";yn{qA@URe EsfXZZ}; m }F TvUOy@SDd$[$HriJ|}X1qǴԌ]*Nk)8_&dhVtvꡎ}:KEVםJ5'U!`j}U7=A{9IL6v[iC_7Gm'H~ɩGj׭maX`@;AK!죊4]Ȁr?%85řh'⁔8Tinѓ2Gl'$b]/ZjEY6H ގ%2UpHK}onM2fthcg19Ӣ.xpv48 3\;&6(ĄQ@с“9m?(</p:fh@9iFsJ?~ԣ(QaaP Kx7O&!7<hnoBLQoހKj]Soe][ܸ sMkQ鮐4yɜ+'4*20i5S,%] R7(tKr2E]1w-QTؓb`h84@|kųzG|R:w[wLqPczlR> fvjif9hbCc SEdANNh*cAn0ݜa]]}Y+ QS=լ,+?1vT[SnW'P|Q.j/¦|@R1튱7W!`sEfZC.Kd8ߟVv\tcjY\pTUgΣc.H>U:[@w'A;NI 0~zXXYY$XZa5@AWN,QH v+B7mUɭX҂^ʱf7e0{NF#7884Ƨ$$kU I &):˩uB[3I 8cPXEYssUo_ִHƘT3y1 z @B$Cm-ayѬ4]xwmWaV+W$[ġhȠ /VGW[Sc5p7hbk[{OcT^IYxA'8(h]36I{|\ݒz;DlF'84>[DZF Zַͩ̾]ZCҰP3'jAilmAEi7D͸z5[5} Bm-ɑiA}S.gA"[6œݞX01iQ4m/S$3I?ӎ*-ZkRh9;ٲ^`PKKHQFBM`?Zm" i rw xJ2-pa V]>+E%\4 " *#'?G&.2x4QO MRXkEt78#h1| h͸Epv𥭼p   ))p{Ad҉&@FZܩ's_xSX+.Ь αHM!d1۞Օ[jZ,4ڮ_TFs5ޏ6Щ rͰ*٠m/^V=#S6K2⾅6&0i>im((#;9m rysjF3s“+{ty5N1΃Ee1={KxIn1Y.ucO8Xmqպ/GOa$;q4Z={M `G4,#87簮+5{DMvFx 8@Nrk@\.<+G#~OjSSA2cp !QxBI 1wv96#ekz@+ \$@#L0[",9r6s]eU;G4ΩӮﮒG 14=%oEk6pe.8Oa 8S:,Jw)]LFYlh h){sH_EѺ"H}S˄k[2!'vq* L㴿eǵ64E^ʯ* 2&[0iuoDo9hOg0Geع$˳$ P6K97]% /Rq"bcF  Aʂ{sނ6.Nn*)sspP$&_%)QJDM}\6OW =_NϦZqrSiA &Ҫ[G݈;003]Pӯ-Ĭ ˁ(7v$g F;KiB$);tJޚhS{[D4CUY?ڻq5aƒ,|^XDk +P.]Xٹ']xܠD;|$Ž5ϨRxR0AIfSO4 ?0t:NG(z+ޠ4 5.^+$_vjF)wCw~(=S?U QB(9`=NH?W5Pt2"'_cl9(RW=P{)g፲=۵x Gkޛys⽁Mm0>)5c9zmQWxlo5ПQ#W7/Ȯl_"U IGw^() yIzrȧ\xBzziS h#81{EAY ?r5C3zqTrMMžNyR唊#P$=%N+>+ު=^w>1AWgӓJrX)hSցXi GjJ 8O"="',h$]r8P>vp3]1 Node-path: trunk/prototype/data/images/background4_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2203 Text-content-md5: a526322ef6bd341eb09c48aa7bbe785e Content-length: 2213 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH pHYs  ~tIME ;$ IDATx犬E1#p0"ƣ1@陚]\@WkWW.wh+}]؋+}GIMNIߣwGC/?4>~iH_4qWO2wBwܣ]S{K2eN67w:}ܼY%y͆~omS *sފG^PAМd-,7cxp6ޘdA ZeS/bY0͉EX::K^P3a8[-h5 L2n8%RfB/@F_PK-zNLTCoT3Q Ԃr] ڙvΆ?X`AAgX@_[̿3X-_PV,pX9iy B%r7%η N.oKo\Q<8,wjvPJ ɦ'MD~bxc*67g`3|tn`{hzbx/TwF޽6{n~r{7l b|nջٛw#fo0/X7F޼~~z`F^a_\nݏ[w?l{w!u{.~H5 QB$JD  aA!%@H= QB$JD (5 G($@H3 QB$JD  aA!5 w($@H0@j$THzׯyIENDB` Node-path: trunk/prototype/data/images/cave.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 55098 Text-content-md5: fd7f4a53316d67748dfb9842ee369bef Content-length: 55108 PROPS-END JFIFHHCreated with The GIMPC   '!%"."%()+,+ /3/*2'*+*C  ***************************************************"=!1A"Q2a#Bq3Rb$%Cr4s ?+Opy>Wϻ +"|QQM0W|V̄ak9UlߨKxQ{~(*ܩ Ÿk>-mbǸV&G]NX/bkmZY,@eny cbό4ǧ|΁65Λ|~v!>zk!£@Hy;PSAZgf.;`'ә.\*UOqHh8}=> !4ckH9⺇4e*z.Ko4lpǟ(6zmj9*RJ3EIn)URq3ЗWWSmSwr~T3;7↱ڄ 9PopWw|GM=B 1WZ$E*3-Hf%G惡%K7Mg-B(_8ɯo&qDqJgԮ]4 ph.])T d檚fU.}I$mǎ+f9-vH~(=7mIzaGcj[H!ڂ9yW wCLUn:?6jW'$c({_6˔mB cv$)ld"?'A\E2@$%b޲b7rf%Uhl:1#AGG;@Z:T[G<@YAk+#m |Y&EHS@6ج~W̟9_.ZB1;lwb=\zze8- w$')I<yt6Db豐  {I8->(FU(_~+S~m.W%ąo?B~W`PX<70?dvvh0c"PTKYrਤwb;rE^{Q JdJ4I38j٦(\;v@ɻ`+I,ۖV ul0(kG6 ͥn]$Bbw1־3•8|4MNpMӀIoc30wJ:&R`݄ǞEH<$lQxbb (ǚ!!NN =#u$ #nԛSyd;OIrvFW7XM2Q W1 x 610UfÓ |u?4I{O lc,^IlP4X#Lqړ^^uXh$Zz37IiuK8sO\i}SkJ+I6JV03`9 >(iiSq0Ɋ#*x1图(ah$.H()F[`Qcyɸ Tn7 +vqX߹9o(*RrI0Zk#41jn HrTT#PW_- _j- #P73 5LȲ`݊P[K $~3Imcu3+w+o4,k2Gu}ˍUᶳ+`n3A6nrs3b@ERDq"H=Ag !,ܸ4Dvi ZbTUj>悯[O'ferhMng[Sx(u$,~63#FaA}Gxq9UckovYHgoI@lqڗW=ݱ`mS#ȫuyG؁s\kh,&RM*ꈆ&g?[6cpI"#'乹Mjn2o}=}7:f7H쮦|`VY$lʣf7ufȼcp Mi^O$J$XbOPa@ ID". WI#0bѷSc ᕹ#~(gmX'+kaveI:[Wy"?3(RM&fE#6FVP AZ Uy6BgX: pG?\MѲ5vjNGoՑ޼::@KnlUxXn=)#_ayL7J ըxW}K 13FB:p@\SJdy3$oPR)> 5C4ZČ?"ئmp'h m>1`/N2GRKxd#d' Pdkqs"{Uq[9K`Nr9R"pǎ*iay P3?"YePUY/H[u]elt%DTkiVfe9(+zȺ!5[}:IdsX]8j7M(}| '׮8SXZ\:nއE*,CO#H]όdP,>Wr~u֮߰5Tm34آU ƱA)3YTa#(+u(Pmr7fDK瀽.TAp&'>1[mPvhO` |dyl I>@9 YCo:ѥ n hA6VY%Un eu `P99L)mVQH(9:,8kJ&Gj61PZIo"wol'1teVPp(4mx4iR{$]rwq:E(S>i,i$0(*).J+ 42z~%Ǥx+FHsijZ~閆\H1@=)$JC I(+Z̞D@ٹ;+9[-Ʊ'~yX_O&f=6zz `&y4 u[挺<i5\ܴcbaD_ O<7r)۵Fyj2(I8P:Vݠb]%X~96)#?T**O$| _L$%}>;U>4,FR" ?X"Ff-::[>?Hʎw9ɦ)+~(K{2efkrȾqA$(\su $Ogug%;>8O4맖9 7zd `89=#d8mfUv oNK W`ua}WT鴐;)h/]zc:X魂͵8Ηkuc4XIy|܎xQ']R8jL{هPqaln(PL!q?EiBQ O;-55M1΁s:KbUWN0frqⲻVm^,pΑl@s?WkrjB"Rvi-4ACr0+Ge)Jqz !ےO4bJ*)p*=8:F6@,qڀI s jAjK+I:ch4:h=#dAxU=jd{mQm2\VvYBن8| 1^jZD"p>|֯N-}YMqXnmӿۓiƚTOq?@qino#(ƭF[z+86@{ F6h#]Zht=yVfCHN ?#E 0O'g"H‹qsTZEP Hbx"Q1ADJ ۑAt-c <.RGg' 09$_'8CLw)bsaokiG0ކt˞J[)Lܨɠ+kN0}5kO#*νL}WF>+O1 3>ޯs.۾(i-wtxh5?+⭵H#DT@hlf QGd yZ5DqAY>)E.9Rc[` .X\Eu}9YcqEh H╦l56$qjl:ql'MtbI MFF,ՋŇcy& >Mj-u=!9jjŽ =",Fq7xUxrll= .$ǭpsQrdp H] lSrx}=O PEa_MS](ܬ7`q{WO]EVS*UyޙCx6C7Z8N*.s =`P(k+hMj0FZ7 5&ź=. 3uf2O_vg5Ο̬ϔێ sM F$r +}iq5͘JP9?T hdp1C~(.cXfO nn6 ,;,KqY %iK (U}p0vj^vH+؊Rd >* jLr02k2g^k#Nt2F3yW1>a4w q;A_VۮO0 >H+IFmБDYn< 5t/),wwU+ũZ$-~CKVs4ͬ(J(Q]vDv\8Z_S]&(ZDۊLͼ"!ަA>=oevTv ^]M<&hÜ h)!ՙĀfd* =X M0I$\~("t*|fkf"l +-$c| .1Kla ]#f8Q~)G"̬(meH0v)q@9N('mB7g))7@*G[Ncf/ g]B&WZ 9qPw ²l.{P\̭(EȒȥ{['J*4X'uAjk}4lҰ;#?յA[ 9?4@cr68 OZK5!9z_MySځӧi-HklCŷG;JkI' V>i8#i9\TDm|"Y C?fqI4~%ͳFKPhX (A]Jc`s$K 1 q\iEK;Os;Vk= .b/K9vcHX$i$k$yk`台x<B5ͮӝπ[x[HGj.юzr]wvc~)wt&#[zfd2+t8zKh|`fFu 6pw3ME%Q+1b$Жmxg mthL 4+g38}um%lQwg" 4'bqnry H22LNHX&0 :Xtĝ0Twc"l}@9b\aB]JB+7./")8hgvjvүrN jΥۀ2~hUHecF9(㍶@gi ԏ6fy(C#l9RgTufa>33i #sefDpdhp g}zYanUU$LU)$8r3RkZ%{UyZI(.WGh獈|q&rc戁_1恢s!VN8nj3+hxGnZwp)u֡$6⁺(W˷װetXc$+!aVYX],h;ke(fq20n1fi՝k{4h/Jahj36ڶ"hV.6GH̊,Op؉c;?N\QhWs;޵%$0FiKkv̞1^6RDl=Gpo$BUf3 8P 8.qڇW#FҤr+!KPٌ <ɧtIy]3Qq lPFu@.jw5ͻ<[mԔAMW,[e18[(Nm.PdiкwQriv^T`{&+` ph{sPfEMmIn?5FWM=Ssw4}aUqJ¡w`~ay!@kMORYw)'Y.mu*jlei.H@^',HsT Zz7` zehL`Qxq>Ӂ ڙpmaU٣D#T aoo1i Zt7`IÒsNan4:8B5Q"e5m& _&@~k,?=>l63[8"vX_sF)P y[L;ⴺWlgTgֆYkd`0$y4leP"PCp 7h cV%َ8DxY:ː>i UW8qȨi)z NeɃ1Z,І6yt˩EmF88C.Pⴶ6|@$Ov̲sV妹be@F8B5_#ℼԭaRb;ҹPrM*嘴x]^+N8V0 X[}ʪKK}ѮW80j{U=r#k+fol{\5/ç+MV}x%Ag i? A!>hmeȤ NtK XĜ <(-/c [j-Ϧ[Z[DQ;Fôh[E]z-5wGX\J]&0"Zѷ2s@{ogs/BNry槧wWdf$oRrGM`z0>Eh2ְ(Ed4}kVuPoshK7mHGGpzr gmYCrs@t/+EjjV _z{W{~9(t;\.0(9u&=t2; xpCp#d F+XyR=6@|bҭ7Ve$lfqoe! ^"ݵbÌ| \v,X O RmWe;4cvff-da3 CMid Pz5èM4KgA<}Lo pȋxZ 'T1q(HC-ē,2lyUF+5ct~/GԙK9g)9 A.H( ޡ&ZTn)o2TVzHb  4QX@Uy=Il&9W 9l4)}>cm߷= Myd7A@1[ԵzD+HeG.C@Jf&j Nz @ 6{BB֖֮r=[[dmqۯm;$gVOP[q@(9Զ' @4y%@ cz8C3[,4IIU˜`Ɣ)lp?b941}m Hh_Qb6Dz 4cw?uka[_A `}95,O4@ڶYB@l]m!V亳`c7۠u= &-njAaU$rXrV䲚N[Χբ}*ܤP[n6G7[HIV@ 82NkjLdW%'溍\dsAsȖ}h\CK(Wd8Ur#;q@! {5wNIPF 7K.n#P];AVyГj$ _cKO/iHe-?F֥e1Sou&e#5+;<1⣧[|Q._kF{ s 2BO-l4ٚĒVC |R]f['AWK,c^UIA[g3V[f"Ph{Bkq&2A(mK~E(s(RV19"Y93?=B[HQ#T ;|aP7%|VWZ}8|PYo6,QcfCP3IL9ZTPa|֝f;].8mm7":J4Qb*$qEc·' y ϸ4ȑͽQmj?n|W:*N̡Pt+X[p- U?gC6O/{Di\,?2P@YtUTgs-D 6184dSP[cf ;XC^4bb5MJ+K 06Ya:أ8>k R.}Z3 v"mf0ϧ,4x3ޚXL]\Z5Ytr]znNAX11#N4wY"y91wm'1  /=/qVLpݢ9*UnaKMNi""3KeQ f%b";n84$cq y^h]ynQ7"w̾ kh *gXPZąp29S#p4̭5ͱU 'Md$k3{*עR-'TPNEu>-V903k;jR4;C*>):-@@mZREw`ySEblv{IJPwE' j UMQ ׯdlS*7gaϸWEuĶjKgmmKfr4Ќn)"qzO#}4;'H[BQ-b"jAl Y[<jmrpށV>BMFpsH@ I?5}qmS9n W5+ 3u/T\G0๊'x* (<6tqy;9/HqQMw$vb8 hҸ5 V sGNI qo4nz4I:viҥb$1&, Tnfm j[<~)\@ony.lZvd6cnZScxfsPr+MF6nzJ_*ri-]$LnIȠ{pa$Wr+zmAi PG%nRb RXNf5ŔN )8eRfz- mn bM4[c8",Gg )`W_w1Tƣ9zSCnY7{sYS_k+eb88/-,m:1?Ժߺnw}NAUzR&JhC0gATy48]0;iŲi7{ ;0zq8Q@$V5eK{xW+<}kf+Š$F!I~+i JS95D{ZFN@=KJQB YDs1uYFNEz"'z_ZQjf4 bzo'~jtR(s^X9ί l t¯bg^Gѩp~սuVE$Ѽ]6C`}*MdgzᅢtC` Z?IR G PyL39ɦ ۊy 3Dy? *)">w-23e98%h=ǚ枱׾QtE"LjzLc$\h/&vvbph/vSHCI1=, K#!Hk/dePkE;FMrLRh}QT\9Bi$L,{1]{$$)>* yd%z΃<BX5a"3@6asYg](d9`{SWyLaI8bIpPd`n7\#q'kkj۰>AAs=[):鋆Hؿ\3.eaI;@a$Γ-{ Hu[4Z& -%+L4fCAC<A"DP* S/QL4UڹYo{ޡr+]fi qzJ.;H=ʨRpN)g?sA=uru5a- ߊKbLN#dH$u~mDjafe`H(4>Kkw9Oӛt"@և$rXD4k ,Ah JI&ԧ,J2"X#i[<[kM!l@w$w7D |֦6Im]\5I0D٢܃Iuk;{ftXp0HA^mF#7QMuylA(N2֯'4Nm@$Np縠+N^[w4X&eSeƝ2\yBCj#p;y[hsbBv/\8wb͛Kn.Ee>*9 `Ps/L9t1vVYα$Rp No6ۜNE8txPL y>*Hph%VB?Iݽ+Yƃ$pͨ^! cR9PX:Ʋ 5RR35tP!>)ېjKQuE $!K~m>2x-pJ(W];_^4RAw?5b8/X 1Xg3HF̃(3+]v49.94`7 qhgE\'P(`r#⭴%1Iu3_ B@trou<$iz8cmL7iW jr -.FDk۝^fQY{nzPMm<]NLTsfR؄@z <`L %AA$F86$G!|Kx3ֳ>c$҃V\_Ο,||v0ep;dd0|RSx"%FDa)զ0f^ z[^]^1yVGF_/GEL[ƂbI ww4onŴ7 Kfmʼ9nK[UclONIo4Qҙ*y@% ,vA$=+4V6eu;kK {~XRzYfbd>)EΦNc݁5RW 3Z8K0(G V[[:?gw/Mz`!V-;Q@;A=7tcE>Et/M,CE"ńh ZV2[g1AlP̛,}ݴ?VߦhTj̠IǨ[lA-gH{IBb1K&lk[%}09?QG5Jd$2 VV^5xR@U'k?u,QNJB4EւI$ MRH`Htm %"9P>|S+RpFv(G[iIR"]n`e"ijN)fvW E[pRG i{D|c@d3}J6ޤƃT&pLq6K㏊.KN.%w<5t5@D4as+.~*72C I`~jg,цVJ9mO|SKlV w%\Zz%{ǐ(y 8X01AN;ڲ;1u۰nrp*su+"0 $PdRA:HֳNlT]iC >k'7 ˧DIzĺ&Mj{kE0*gt۝CR{[R(3 +OgʬpWs@L'!-qD.^O酭!@X^ǜ P.[Cx@I3I&t B5K*J3k kp7~ ݻ² 1ϊ%%); 86D }eۭ=7(x1}dZi1.6dM~Pq4SA-=D4 Ai"3]TiVr~iq4D}Ba.3!P:nw}/S&8g{[GHFg <׶vWwA_v 8,rA=+_kh-6KsMM$PSCTpMʔ8Uj #dEY]ZRv;F;Spw1Y-0QMs[Ncy[#+O!e}AAe)*8Cz!QnSGgԋ]N%ýfծ 20YQ+H<֢m?O+p{p®Hi &؎I"U Hs"f3*[(TX;b{s AoW&N^\VU*z,L@aȠ߯N2~.[3['`ʰ0i ˙ FpvypkŠUfor+WjF8?͵9k; PSurfv;4YEq1 FHn.Dx$}2bEd-}PJFF#yim%ؒ&a oxѭ@cڗj54JU 8%ϜR+ )N 7b#g6>kEi ,axi[U*i5ѴL*!aRXar;QWt%#\ڣF8z| -.|YswkhIph+k˻0Cb呉I`Gw1l~jCCC2Tm1uP&-21+MFY@<.Dh #fΌRK{BeUg;@f-KZaA^FRv=5UCTP#4f[mO  *UTcY37O#cJ~ 0 us.9PcV^\Az8q 1JJX;}QmѭLʬsRG5w[$h dP4XVO}7s=H+QUy:Sܞ-[m/RRIKokђ1 NOkG\FHȬed|AW@:G'wc1Bb2x8`+#Ws LJҬh_.ef)эTeGjcx;d^[XHÐޕ^]jE"9'=]u} L8>*KH]@cs,QZKoo~m(VK8HhC(ދ}K2%;wA }'W6b`kiD4F=ym\H]Ju`Q433jvi>$w>hn?me5Srݛ/x|SRA.fh<;Vu%+<~j 5@{[iPom 2]Ӆ hl2 T~Op 5}̲~<wvA(BP7"kPMm& V[>>"O94=&7A }-.̶hmsVGDVl?wOa7'#/um -.z^m[Zl&۰vtʶI'oTݣXU'5 ]'̛g%T m2I we\}r3K!`@ n/FA^)I7ޔiZuse@˂ e<apy8 ^5Eu8c2)|JuD-۷5)sJoqs{q/D6R{E[g"ZuFPz[T+pv]&ً2|e3 P 5Gwx19^; "{ϹBcQA#IcwϚB~"'ێ"smCVjpߨ`]"af8rNgu. d I9 |jr@X];oP Po @Ż@{=PCЌ3i,IuAܰX/-.V-s< %@>1Eì܈EFpK/]唞+ۋh&u'qwZM~ KN>ǞjRj{5w ,Fh+VReCi{DN(;9Ixڕq$q% eVnBgԺ[,L|⅚㪸E9A[JKH4_s)Qd{PיɍٔZo`=$1w1[->B VwH=>h}ѳ@qrYnik1F 3ȡ%Eaod8"Hd6k!LyY+%mlc#of#m4 t{!Pd?*LPp7kz^No0v%n;[g#boc`qKjyN/)X85MGF;X}ݪ2G5]&#%1HS-0̀jϙ>gZ=&ݦEkYfCieݦpY}.' @7jrMhrTUo[O!\J~((`6t8;eMi#:@Z+B8 {Zi!Q*IAILWinvdQ\YOI6ȸ#]Eae&Uq^Zz~[;'$[h 7ӦBd.4ܗu=ҹ,g<v>w;;RZ,39 Õp@<+}A !PZ4"PbZBI"6ť^*ɻq敬FE ;REM(:ifI,PO5קtq(/xq|P >yU;zڥknйȥכܺFLd5o4y4@vȷ (/m%J$dڴI{)Ƃ-U߭M)D1 'ScJ# nƘ[审@C4ԓ>҉< #ml(&KIsP;l]V~TL&=L-f?NuT U-snJ+@qp1O͑e$DYh.)Pg:diue0-5}ivT$6Z&!sFG aX (4vBED9%;I<☑e '⬴HDBHwGYm$\ǜV<1ǐ[zRV F+$3ZԹ1$FVnԠmP'bi_z~|lL>P},?_fs'ѦF`mC2$畂kE|P0[@v H4e&TF1[%2q\E=9KI-v樒A f`þ t^ьk}kO (̤j}Q*G ? L!T3]X29v5Yd`vR=Bt&Wm ɮK+G r|b6ދw^iNќ,! \O-Eۻ(V b{B_ _<^*I+!x(8!%'x& R{, mx4زַ͍O)(+3I+ *d;+qk'a#}H-gOKuð/1xA*:dk0Ïi?Ph㱋,Cl`s-i-,H"k&qAҮQխ#|WCG(\es\WMnyWL^h܏ WקpxQXmӉke$АH\{Vm@$~1J!Oz`cYϧ+`!|U% 8?,:elq@m<,xWbA$y#XYx NVI-~ +u#*:;I H9OfF0Vn;.XG'^AsLK8 q@{ Vjvcg47tA8b-H&ѓKIo[S0`(6W*ITv $Ȫ$cr) KrۨFv$t\⁍ v;+:* )YB/ }"~h7ksomhGsYJ(#qr*v#Da4]>IuWlރ+j* &H“ӱ|Sy '(3 mq#8S#ɪOa61ӴUws gi-T kp2:Y_iuA2 b7~3Rg8}DZ* .(h9dg UNJ\p |5zb<ƿK#=STӑ 2ȾO 84VmZ&߄`9ҫKXVՋć>1Zb;v&U, 7(n4i_hi煵ȧ9 8/x"I(KF&im6IL:lf~Sm& 2BN{vNO|Ң)€(%ѥm{G~ksl80ڌ0yK0JFw0qYɢdF, U C6| mΣc/%HYa߻+[{8b09qAjnݎ~sFj:%6&Ԁۮp@KXǸ7֭c%}i8w1= 8Ͻ?L2J[N`rH Qqt8ù_O"v4.C|E#b<=If]Ƈg fl 繦'TpUN^qAW 5ȗ2кL:/$y_BHlZڔP1Be$O>:FgsyYھrkϢ+eW4`(3b7nk?٭4c ˜ح{[B2~ U葬$NݸAi 섢 Q*7]yviӟj*y$o%`{ݺ->hK=bZt)L0SA0d#q@S2tS ldRJ mKӒeK/Poz@& ~k׊I2a.EI@7#O@Av4aTYwVш/s0KK$(sW]%(#>[G{)@l]kf Ku!yv_ [6LJWrG`3A6_ϋPSmUL,4YJ#Ӊ( i3p@h0PM)oޅNJ)'|A dE$eq Ao|Ya{]5e?ictL9*(>h]zG_`FwT批M{]c13s2dpљ=~kZz(@ۊJ/spr[$k{z 3#$mZ ~?'kEX?W5'FԾBGSF{mZ$l{q>({%!FFED. &x 5Ih#vUC\1Xˏ"XNg+A+o,A9+;ɷO;I:qWua,<A+M>im{ ud c#=g5AÖ$`VWM[nai,tirG+>ң {^J'c/pPdAϢuPdCf!$ߊnN,jP'dm+n&pی.KrѝƒhX)BX)skq_@#&0hj7m(2|`4y}J&u:T'I#z e| x.X67(<8}A[c/ X[Z 0Pk+k,F\,<=6idAr9h4R6s޼YpUuikX[e {#ۿ fq>lDSwhd=e]ZQĬB3Jc4kMIJ.A|֮>ظ'X >kaE,po42-1`'Evau\JB٪L+v2h94q4lGr;kӕcqga]/^1fRGE 湕5)ͷYU^\M%A'1;`sqPnE(:uPƆʟogO}E-ϊJkme#59o4S$ cAˬ$TX'  %#sqAzP<1w y )'47pGi(WsKT.:X}*Kii$;MN՚;RY1z6Q19EeRaT4Cf sXNrۜ|Wދ`]I >vi"I!@E<7(Ph4Khd{=\26U#K$?Ogv5T*mV@1-giK$hx&E\6GϨ6r⁾oh Uj3CxhmP %|gkGcVDy&.;]v6" {[J4qAXMByVvhPB&{ DBBDZR|2 6KUت2?@~E=?DL8_(G5H}3؜ i[MO84(p2)Ю$&hd\XUjg@Ǵg;cmt$扶arOTiؑ3g07Gf9Z;HM*Aڲs޷IxI*bh8ZY2baA=]xԦ`dцɪ&*E# vaL, AV=0< .4DG1[#3  Q,Rȇ´&GmU'&kԒ^|Nz2B0G'[H9^懺ܦ NJۤA 4|UO&sރ31'u6kxh Bu`ԝ~թY8'XZ0',n=H{$bBʽ@zӖZݓM&eqc?Ż!H@ҵKjC#3NtKa?nvqi!=b~#(c[E^<,eL~sZmAʭ$H^3VmRn6 3ځU&"?KE,opr3ZYHw8 Vk-d: Ys@V{#fa ESSt ĝt< żh1oh\"|=Gu3JVGuh5DKht6qP%myȿyǀkI2!D&MWzKc4]Iq{ir/!_9&vz('ױw81ljs _ i"3m͐!Xm-EGnh3kWPZ,bWYcg@(~)SLI&圈Ǎ/NyD+pASJGq2u#rʊXLQʎkQ k\]W*!w@ ou[("<@A-QQP]sfA! 7qTf 0D 6r5kk f^FFj#SPoah4KIBy U㏨GQ"O$.pE(_z;;+>+랇mu}6eP k1/)?ߓɠVGoۈS]1tWqk#`lqX=sF}9ja$cn?Az Ȳ2lB8>RGGe'*O4(O3@>\:"$v: E :툜L"Fu$b>ҪMTֺ-!y_jy h8gY ᫐_N,=Cix(WwڜI) =:6o/HQcJK4Pw;E <,+ %͢&V /Ai(0q@+ks4HI]4,+)'At@]NNj%DD.?R[*)݊}O !@lV7?R܉\" UiC.iDaj/rT$M@cS+=-V/VM6J QP \ h3 X[p ֺbF&H!;g @GTZtoZM q酸hn!\hm% &:f`V=6{߮ GOsL :9q`vl]FNˍ.)d?hsC<ҩ%ؔQ#QEgR{]ffS$Ѷ@mІBWǔv;+ˉ"eOѿ5P$_NP$PaPn0ij2tDDvig(9gRJ[Mo$lGOjEڌ8h,N9AFYe*>LOo6 ) dM<ҡYf8j}2`U|Ӌ}6͞!,k62fV/LKK m .M$Kvъ9@P4̃iXexc7' y G PXTZ EZ|歉r3@3[?*OU3)Bdq"!$.VeQpK)H<EsC؝?i(+aOsAѵ=鑑"}ڰmheyi!RU4!z7m;FM[Ed!B݆b;4+\ۜK!tc?uh.B8V]{g=k-9 _KaAc Waa WȣPm>м+Ihx̙<;See+8(Tv@ :,qB^D۬`G r{.nR䣩 MR,DHr." P9d9?"@9mF+o.Xڃ_Bz7,%pjut m9ap,qjlԀG @V>F*1 {AA5"P-P{`ŶT,2fh<2hĹ: >D@9ƀ6B\u8L^7B,nQE %x21W3?iDthK9d,A P^n"AϊY{Q ȫ 81ǁAJꧬ$MTTw˴M|ڲƸMon@Am{x;.͕Ri G=xeV$2)Hcƴih{_ $rUMƨ2Or(Ӛ(60S`5䛤h$Շ:8b>A9VBijGp!pXIS"0MRm&{PPvFˈ`q G, ɠ.ٍڬKX!6H Sjߢx~ jdˏj:=7v}F޽[dWKFɯr\?Jİ9WG~K)G'3W,v0##s@Rr+!^Oȡdccpmv"i4BUDg M@) pE[abXNPTe`U9 tY9Vp#UUv$ SfDr,NB~*AXH7~*F0!5=Yzi(+=tt#\\=Ete^[o_5^Ip` }verH>c]V"POVS\ivʃ$S/Fj-, 7gZ)p켞yP.BpMK +*&hG!{5^^  O#9&Sx wUc|PRk$s}9LvFOzX%~1RS  e2H&[[Wr1AytPqzAlhcq &^^( x.98|r1ڙۦw¦YKR1@+\,'9$*mp;n=G "26ovPJ_Ы' fl ȷ{xԮ"loL,\5lIUfr3Au3ml?Z"EN=͎iE4˅UPp?.}7>ߑTm7Z5.,"K%NW9yl-弅85]ё|U3!P*]Q7_GA$٫q &ބ рA<9«P5YmWuT03?'ao,>L]y5b2'UHDycm ǀTT$ gdRXCo€*~DO#p)AL.XVmB !Yz.E~5 GΘؼȡ7 {dh "aXW60K|UEQF$Q{F*t s@UJY_ Z"RRԖpp8w籪dHnTH P8$8Ҭd&IUBZO7t) ܶZsKë۩~y$6GКicdە4KzE^R2Gp੏ tYE՚\+ \^5JOj7V2-݁&##olB1C y(j, [@f`;MC {OdT$[ڢV> ̶ H%  cWp!oTJth 8+ `QlWۏ&*IWϨ[3pJ9!eoB$N ȩ >~(| UIyF.FMɫ94 JxcjI3p1L`:m(=0 \@hz[y% 9*a1V䁒kU@ل*eA}5[-[K24 tECao (B?qjw\R&p h qo#WĤUqZLhw.;}dskh,@41?~+%jϪ^'wީЬY̲J)RK;3dq7#O{XFA W*hz2I#2,30ŒL-N`"h +m iN̉,B|V:[ 7%89 ,dռұqD]\mAG"1 q4Jsq =Gj[|{W=д^yc[-6{mKdvej&XE_$@,^WQ+s;q7OqȺOomn7P%H)?&0d0dbv7޼gO8'{Py;;+ ~&ͫfgbַ!|`:pP(~j҉Ksi^J8CY}Hu>{+>; ]')zQ"How&+l_NJyz#vZ@` P`Z(hSkOAj3n1ˎ H5 %9pB8Cg7,6@8e`h69)<`(6,Q>qXTki.1jZش8h(.f>h,fŁ hmo.: _!.KcY] fL( 1[ .>~+{P=f >LQrZ#=ݐ;[#`:v`x-4bvwKX_W-*Ϧ ^}<ۃ4s+4t0&&v5r K; 2H2F)V'ȫ/&LlK`՞q.QCn|g4[FU5G5G߭ڍniyxn+#Ut1QKtDMP{q+*|WW5GQ)ϊih0[zVhę{Hս$?[P̀SPn;6 GM^ԾOI27b? 1@9ℝZ9SEH1E=Z_tC x3\ 2Ob*":-ϓ(nWR1_9 vD9*Ԏ6_ ^ݏƪGaLt^6`j"d$5 iI"sS$Ah*P@ c sPUI\laնP@نEqqlKVxceV `gd'%槲Ok(ɪc?JYfr73Z*hph+q:9JkN{U7jI'(-)v⋁t!wJ 3KfNw;cBP&sr@Wh+c4G۹FA=F[x8/*/cWhzS}5?O8i˨_JDldq@^Z'K_T;7酇dTMUTCGAOrg,{P ^slK EZOveccX#2!4sz#/M;p "Ȧi"| .5QO96-RGb"iQܔ ZģD  mFJ 3L-a/ks#M,7s\:ڷ! y2ض9?cՌ0@>(=6KiAxiie,M#j֑#^W?]Ο #zB$23pĐ*]bk_AZ/L?m9GIP4I5$Ep=0׏^HbX?|0Y3;?}ؼ)q!-s۴hp?km>(+ϓWBAe?n.Z}M PA]Efy#h7x7(u˥(?vfk1nOmn)"T$ ZG(ִ%U^r.,V7q_@ueەi\v9'"V|7O9.;;f)4ݝ¦dl|ז7\04[sn۳\@o%D RxYI1?i&ӥԤ 9bq/-"A@=I"}OBIG'=3hwC I$@<(jMcO7U p RK%$Y'(/JT(~i X==bMĊTA#GqgL%=ACD%c4u$Z(.9Q5ʠr8FE#:1ݎHQ1IJ%-m^pFY-=]:{?2`` ~MUPշmO_cy#MRVo#5u}ru$oõ6N=~+mV,霎+5} -@7M^Gjx(| @ PkA ?9ic2!a[3h[8h|P0U+FqLeo *7ej@ 8܂8L #>K$1ZǺ2: 31lYnUXF-c`9>hE*h>^pE MsզD\a<܃Ouo,Nї$SʏJ HrށM 0ѓ y`AY.*19-Io*lWLi,Y!]MeRIj W4*&5#W2HظfP9S@BgKwsTOzW$P:ը!T TY Ib |ײ߱+n 6XZ3Gbnlc#KvAj7Iǀs-}M\Kiks*Ks9R;ROHL֖B$giK0H1(+QlBGqڗ=gL%Pn@MIϵ G84ũِ ܣ4X (#[&q *rOPcW62mqږIyzLl SԽ`V[uyƧelrAIu+I!\6r+ H#oxu¨"y93NreyMtӬ% 16y4Rneʖ}`Pzz AVM;UpSzttgu'p6q=;q*_4/bZ[PD^Op+Z1:n/4aKDf'|P. Eolu _jzbDȷYy0/hw>0j zUơJF(GL=-#$TGbѻ>;懼Q P}5F$.sGK|ep juNk\ h%@ mDD-wVicdk`{6A*;P"l.=V;S\bYQZRo h-b`)w8nH{ٺ$c*&W}dR簖OlDjE&Q6Ā€unoUFĚ?UB*j |w"灞o4(>䁚r (@閭(Ai=.݊惇"Fsr*PI+`>M %) x+ء䏩xvz!p'$WO yE[4qH8hLUo[緳P@2Ϛ4Y21H ~gm-+,kT kp!@wrb 1(gꔓ 8a\HnR:E?.?E/ vr Au ni%&k=XsT?E/*/,8 _Io QN9Nk 3e95}/%E7x.-b;f\(tC{PrK#UѤRŻ;$ph};8&UFrÂj)>xlT"w5(V$Eٖ,sZ])C
Z5"!n@K-L82}21a^}<ٽBwMB2AjBPRCi2Q*/|sAL:agH5Uw2B;siZl<}> 08CX۵4X!^jZne?)- l=/Yv[i8[ 1UI'wWMEATlpzb $reG8CK,Jȱ"ϴGϓ@f-ßrU]ȬHL)T=86s AU_3%!,9}6*M҉v)vd ׺p;P[y ג^؂?r Z =3Nb@sځTG*/|Pz\yOBh0c~ue?Nəq殅NIL>qT {vieU0Q|V+r`{ȠIe` [VB⼗q`@GکfRx{e{gMϒp[#Hv /|ۧBtKՓY[iw+4wf0IA,TdXs XYalcohM,{4K7uKXʱɭ&T;؁59.Lz~$vP-oLYF%u\݊hMU^^A9c;@8c҇*.!+ӷPU_C8U"lzR3O4`biffB({MxڂedHX[) ⾆R0|@/\9۞ة,W"nN8M(ādmSQCkHP_CMb5`0,A FKӎ%V=.( WF;8I<{ P۸CkHfVE\(2**4|~!pOb.OqTO gpNJxf\e Q,%:M;yQ=%q(/tmBw:1#1KW(k{vXb1;`v5 4 Kxۊ)j' Y(<T}O%et[9m7kg4Z" 4[VePa?4X#6yJxj4tB.Gj/n:a- I_^2L)w)ɪ V͹,~()nJRZ\O  hp-ٲ}ƥ%.(|s*haQ@ҙuFxqE٭m: _iog16Kn+EYYB@(v8 "w%r>톅u{x$^v6d%EUl2ME~h )EYem"̏,, *]kkbn2Ky9@SfI+R5G36ۋ|ϊ=hqn ภjf6HDXu<}a.{k+hn23\?/Aϴ+^S(icީ7xf@UIgZʁLD6`G#e}t͔wdk; ۚ 2vjI.)]nݭ;rEZ\"ɑAO8*7\.JF T\L@xcER#_p_*3(R'gqA%rnBy&riP*P-eb{=IY??m2P$pLnDR[2odqZKՙ@ߊ { >ў@o.`> -qyo ogd1x@rJ]OOn}/-øOiƟHv;аi (:O^'=eI,Ζ؇lF׭- |7BMm,ťt{4Ue2d ø8Ed!2@Xxo2>&EAr6{TX9 .xPYd~([k72f7` msE~*-g&H t TډHb#UiqAKbxQ{yUMďbMj0c̟NlOLzl2NEL@ vQsUGy1/hv~E Y,] PeB_R{MBFs.R%6qI39J\|Wq_w£Ư FT m",hHsWHUYU4Iܡ2l;1j^H^_n$َShiSAl;(#zsZX@cCR(F;{AEΟu$Fw؜gR1G#m1,q8}zw}rn۵sڗbN4!$dPLj丘1P3ڍYV[13 4P{v|1Y  /bx5(ĻXlOIWMPײPk S@p`- RX0x=S'5koP;siV6"˪ud3j\K5qA Node-path: trunk/prototype/data/images/cave_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2387 Text-content-md5: 8e6c6124b422c6b10aebc11b11d3acbd Content-length: 2397 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~2 rbKGDH oFFsuG pHYs  ~tIME {5IDATx[EQ>],g9[92Y, AwᄌkUgh{NM{K8% T'J>z"ux/;{ށ7RoAU,Vz{] }'{7a! l^eެ^%.a:eXzpc6,PG66L0Yػ0Q5ꍘFLTuz#&A;1IֵꝘRouTb:[[1Tvb7ktu:ct{oӷf6kgűmN#ϊc<-8-8/Mӷ66f|j#os ;aƷ66+vg)f~Zc]1;Vqm}.ǘ+L+7X+b\ 55?JyWBi6s lG%s jG̮eO[\2 V>}oqZ*.F\VunPO uUWGb#1OUꑘ'N뜜IɏI T78=J&'@R$%@R$-NO I I~;ZݟO￾ˉ===W@nz:u{="7Qo>y՗<P1WzܭN>z ˃wc:wc:wc_P1=EC9ݪދnU`uPb_HQݢފ)ꬮU$uXתwb@q]ވ긮QoD^Sy[Sy]V/uf˰De2, ՛Pۛԛ7Sbup`:P@z"og$ ) ?-Qm ԟ_HJGJ2I.BHSԯ0HJ~Ho`HJ>TGGJHHoHJ~HJu98]HJHJ?LfZSIENDB` Node-path: trunk/prototype/data/images/console.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 36412 Text-content-md5: 38c3b404d8ddf6c7b267301a8fa92ad5 Content-length: 36422 PROPS-END JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"A!1A"Qaq#2B$R3Cb%r4Dc ?^Ivw [5%e89Z?=Pc-T/|Z  M@1)&>7Qu(h+# O=.<=WX;PPsMXQ,*$^d qR,*8 8 rM Hه#?4ܑLSCnZ.?"1 C"}ㅧ͸0h&dP1Lb0M/fsdzF Qzi.0Y gځhc=i;R~y;`SJYEb܎(XQpM9⑿' CRªJ5~~Ԧ\ hձg  e@r,{AJ:sDFу1Q̠9Gq8P=x\ 7!2 $i&LP-#XOc %A#p.>MGJu0F)bG\4`01S*=(!9#wɣ x;$6Ҽ| 4UQYy#(X11Ic3w K1zv~"*_$c>K,\( Ȣ/4² R]zWm<C^h%8.y|*&q@:PMǧ_JrǒqNn-ƂGZ4dK@sH?8:9@J3C  P ⓸sҌ4ğHK@_rh⋀zW4s@ĞG34ہO4 XL<lxi!@<Y8⃮$~[ 6:Ҳ4 :P foA 0;` of2P0`ޝH1p4c8 t7WiC `]h&pQc5 +Zd$J#pzR*a-" {PX`t2ejb <4Srrz_ ("Dr;PGlzsFTci޺8E\9<{C T*T5Yo7;sA4=cӅ@#4 )r[*@[r4 )Q8=)[??#%BTV"#(%TP[ F;Pg*܂( +bqKs3F6#&4N(H?ތڏihG.}u(N~(v@(`P((P  s@Xcq@1Flep(d"穠=jgǽzM=kdՆ7Z0 sz@`(p3p͜!1ڍC+tU <&N0)' 1HhMnJ6gv}җ5 u=k?SF>k$-,qDYHp *H,M-TIIETBN) 'ih$F$9%뎴ٶ.D9C=␷Lz~T(ޱ"iw3x(6 &dˎ;ԅ%-,/\zŞ!Ze'MN#0 dxK5THX13{z3X44nO4ZI"7NGAAg{]8JsY\I[S< n0dR DIk S8OLqq׊xrI'!|)Y+JWyQ B5t EHʈ)Fg ,o'=)o,d>x R~)A|CT%XxG$}"n_8щI _"79?j TmUiL(}z@'"{B ~Ssl\*ouTē>kx̍gdYa$Ae=9<6_+^e<4#I\\dDQ5P6٠qlHTbƲfViy+2(I1fA cE;of$ԵC{FB3]>?^q=w.aWLLlmG'9U҆Fik+t:u\"f)A p:ܠwɠZ[6gkf6q2hǽrV׵trdr/D$ϵTX"SD@z|W.:1RJ#bAeg=/苋b%h+ZxLS!*Ol +^BL zP"xL6!8"Yn␅%sYɵFSB qN[ FzAo}\+JPj]Km[c#,8nT$jImof7٢D/D֊BkZ%,71y/ph0PC3 ǎ¤iL b؄PgKEP `yN+ⱑs[ N F!$.Wt`jjXiZkGfRI(;F)"DKA+ZN<dg mۏ8<)6T`w)܂{Z4hmQy?i2q@q we0rTp}S&)$G8]߽H@]NM!qX8-ۻRJV0zRDKɠ5^`((`9hH`'ܼhXl\`{Ib0Yp2 T8ǽ&,N0NiTg4# wЧ%e i)&Ab ǃ5ʷ\?'= ɧTq9mѝO$k Q&-(5r}j!.0BҡiTXi0VsJkK-j~ Az>RLI+u&[l5YV"MpA _`RgЁP'vWݒ8d ?Y?kn}Cߊ ~ϯIߴykRF TSm:5&R U6 Jmfޅ{NR Шt6v&AV)[: nd2:#0ȧYbTxS%Ѧ!ی9'bFEu*P3ap656d|m?{j;;C2Z!c^:uΙ##( LծnX]\0z)rKlޝQ@XW=E!; P*јx4[F梴UPjk>}S'm*bpU+W8*ƖsH"@7pjhf>ij[xIع5?om=˭k}=֘MFU˰cA?:HwR>)?FJ8T&7;{zԃ,^tG N.d7㊆)d 7^Ռ_AdAӢu0=c$;X?5{_5YqWin5#*9ӛrLgLHܴ1\dڤdUMѣoa@Ji4ڭ Xu^23M=` uشo+3c T{C *ށi$ L}ү َ:ӈ3n9H\&WJKG#5"L{isȬ?ɠf]*w*1i_q_ԣ#ͻ@=h ed TPWKrY ά jd|GTFɅVo| Km@ùm[) C)h$o8aӽ(1MǵOzpaw@a0(sR`eAr( gޛt-Eyc^Ե,ԏJ1`g8]p8@=ڈ:րz 0#=i XnM|6@#榋D4ɷ8 ,g3O.8 JgDh< ?ޝت旵HbLqJ)8'$^bHL IaV3^MAozMGLHWNǧ.{^kG'#i=ҸiڥBW"6iﶃBȬ$+.he|9N=cdm2So<AZa!d==5dZ2",zzʷ=Udz|PVAj O-Pp*T@~gԻM€7?çeOM.Ӟ(5v~&+?mi0s*#"1f[il;4U=FQ9r)'\u줷ϓ4s#b9 Pvנd!L;~H?UtCpUqwaimtgvAeխ^SmQ8R{l.OlP&Nx\;yeaE`c'`*{{ dz3ȎFzp(.tleXvLwqTO##),>S[VlrG2iQ̓?[-tP[nBFfL0W}:4G>+/SB֜_ 82MɞU(e.Zh*hi21^j #BE!ACov@G\B+blyAa\-2ʤq=) at8IB̋0\,9+ˡ]$$sKz0 '@<ŕGSi)U׊} x).T cm)u}z31mc,Nƥ 58)IZ aurh=E|~⨼yd^rIZDk );H-~;TG h~zdnYocJ2;b6@ش+U5 y'%K;nsgյ'rx4GJy' -;Rdߌ0J5I2]m47| J$sWFgFHa\i΃-ȭ' bKv *Ra eVy|yr1Kc`CK x `AU(Q SzY3.ր@=hA8#ylQ#PCsKi[`~3=r۷qSK7c"BEQ v|8i+恑 S,?ȂXzO$@pn$`zx+;ma,`q'Fzz^UѺc5Oz~RvNqɭ~v+g,ƂԇL: YΣ|"WcZǗ؎ Ui2Ϲn$=KO7DB wAj>1Wth@{-Mtc4y v`v(cs}.vsړie2YNB4W%-DFH@ ˾FЊfHqq>¬أ[vy bKˋjOn!XF9aslg~*&Q\^:Ҭ%QWA`Y$>"+apThqZȭfE HQA_w~R ' 8S!mpFyZ{\eofJh,gH‹m_@KJ]u*YG#q3j϶RUFk+q Nx Re gL4{ǹ|]l; kқ}lMM5H5>K'y Խ*6IGFh)aFh|'w-U|zWR4cM.Ĺ54ث"h95\:N4jH+p YDF2;Pj8b?˦i4ҭ͹#o|Y]K8nC: h,-Ԟ'~5"SJ˴* fĀiK hrA뚷{="8JCV7Zf d%,4Vi6zS5r18m6sz4ZQe"uh}mcG&mI,63sW6o9#z=#=)Ь?Ap.uTa h'Ev88Eq`@=9dZLq<t WNc =HXGL >R.F8O?QGL}o ރ=W=Rmxtbf?@ E(l42&ֳK% q]rABaM)p:~Oɢ4ѻ[Ekc8A1F }˦0GQ }σpZdBG.G$Q-ˎTsQ/o\P V27571Yh8֡iw -b0qT23VҰ)[ohRiM+*XZʜ ۊ uR[@Μ $MFAW(Ո4+6EpOߩ,HT 渮\<_"ubB+ɤyiklgCn2C|WcA168"E2]m_WZs?8\62vR9B2</6ITrzMgڮHtK;1`xvAg@GW\#_]n8bb>ӭ/ LK ^̶l0A;2DzHLrFd~ŬDv.[ UH5CA=Ln`UƭcoT݌f ϫG&g.?ӀT/H)'ֽ`3#iVqJF5o0cݕ[gG'?ll⁈V1[F G?48))恴PZ7)yڛ< )Qsiw4`MPQ(ZiDL (*줱Œ)q{P'怋zs"V`L|S )-pzPFhDpsRVAӊjA$F٠FᦰĒۈzycbc8>W1i$qȠ<=E֢WtGO{1bULVFRA4oX-vI4VbO Q{($jSbɰAqA@˝6{ O LTFV`r~Խ29u_"2ǵKaBPpv)[f$yw%('sA8ђI#>hrM<#\B8On)/.ӱjXv ҁ~q@l'Ai۞0%Pl̀zԘmK=EM;5-ƹH\T1=ć~hK1'/ a]Ƙg83h4@恈$)XAౠ&ؠ玔J\*ϵ/vhP5#.xtE(fhwt<E=Ih()!8OsE.(4XbmzvBF_jFҁO4(P(P(P#WŖ5K*XlVJM 2`*Sl ךmA@Xr0T@NE;w;C,(} rA467cE!yFFC@\?TTK$o|]S-"?uԼHUNUH\}A+k Y}#8IN2ǧmqF&xgAyi)IJ5AՅL|>~Lƒip}>$(M qqv81AU`.BV#v]yrе1}c-A4(۝1AFԥXW%H߄#]Jt.YNIr.$#*: On0}/ mW6Ǒ&vh/,1֫bȶP.d;1;PUR갶Ӓܚ'i|5:GgU?tAalh²"֟]'Au ˄XZdCyI,NM 8ȠP1ZjL:4e/$Qym#z v1*Bٛ'3@<^M%rTtXXO*"yOj:i/PpA+HiPYd~rނ}$bx*>ikq At6ӻ8h,HB(BBz;QlA[@٥"(lL3lIlj JA`:梬* rHf+@T{fVo)[q(7h-F\с@B40(T9GBPB QР,QС@(P@(P@(P@(P@Um%pYqRPpG$Fy1jJLryr~kxF}J/\f4Fƭ ?ʏPё ۏ/;+4j0<┪Geqɤ31G#6X,ێ}JQ_WJFs#w-m qJ`R8PIT6ڽ(yM $nH;)4pGj ]eLN`4#AW4" \^~S{⌾I2&׏#4=ʤ7K&(BN)|ҟkRINA51&A݂5w]> Fd#/h1fft*FGq@(A ͖*`.H ǹ_ǙcEƞј݆搶s@OfLߊv8A( `c3 )Wp8Qx:);FGJ w(8UaR9\Q1ډ˹?8g&: HUQf=Kn}by[xN(H=Q%qz BiƇ#B\24Gi$QA.hǰVa],Wnku?v&5`NO޺Qi b#1AU|$#wjwQW{xV(8"x;OW`MI5mEP0+x 'V9\lt3]dhlP;Z1s@\h#8Q t9"b4$q|f5h^v GKpA#NZZFvqX![[ʌ${^ԋx8Enܱ$v?5n9klЬjx:dEV:&Q48P!sF 䝻sO,J?z^(Ą  'OРBċE. ' ,s@p?,23PRY8;P,){UgPonRU=\4A$Ȋ ϵU8 @ތDIP#3GP: :U 8t(P (P (P (P (P (P (P (P (Pz:( (\[I pxx]~r=)aâ$8-BNzۙ9},в5̳m!۸NWҧRHœrC*84[̃iXZJ!{-gF9L9~{25#kF6Aq\V>Qsq'G<)~RLQD{c:P 1F 1A"a%fO/$KF(7ѝ|,vstZ4ayMOܟj"9}$>ƻpv4I5k<?$CF,aAZTr\]]Rҭ{rWi-( l+9%E-UA}nNx,'() h !&Oftwm+ ,8: U B B B B B B B B Bi%=hB2 W2= m& ʕA |L;rz%HE%-24$,@iB0rG4 W9G82(@4CոiUr=D{o/SqL#ܽÜ ==1[Y&aX{=7;h)rTB[+Efn NO5ZFF+1Nk~M,y2 +xI GTK(P(fBBBBBBBBBBBBBBBB:MoSMs?dhg 2M6'WӒ)nwIFf;i~^T篽1%@Jjif`K O w=ĒA OCnzO^i6 -o[>hv'$~i~w3@W=d|Sz&rNs"#$z&4uaM:Q4{}K`.ۏ>` Pٙr@@M~PݒMy((Œ 0n"#%Wfy0;6?|WqtWRro4|[^'Hv1ڶc@FJ[?@?qւSqA.Yźe~ܚOcb!#液tG e<]yYoAD֑:T;5o rPWAF',~sKMaS=9ͼI ^*I j#pОR E8驠E 0zՆČ9fc-F l@āTOC4Q4H~.űEa~~֖W[O#W$ȹGߊ](Q"N}+r3ڨP.R3 8׼ YWW ,pHGݬZP?ҁGBB            qGBBBC8̫CHwrU8L$h7 30.ߵ@l%RƊQ zuD ##ށRFȩH82_ށ7lM;Vo1@Ł)RQGEI;Wn?NT!Ӵ٦ PYnB6zG| rj6j'#ts0}M Ȅ*Mױ11UB>iԍc^{wފ3ځq.–$d1)b zV u8VځIWP/z .OcKH9⓵Nz9GT80(*1?/99If ,/Nd95-g5-wY9' $i$xXYDWo;4wuiw&)hHm18Ps!>u^=Ηpru#qm9r֣SY ~ ӜNh"@(Q悝>Whǵ PI7pڃ=er\2&yN+"ݖxmѲO]6i [)3EMy95oٷ`Č45w('?"ɶFƃ?DZx,},[HlX`F#VO*(:ޑӠ@1LAWbB B B B B B B%(T 2r?֘v.s2թ8QI%4ʣqXn,u( ( ( sC>0h̨9@4d_-I$upl>ƁK4҃V3N9&ʏjdӪ$ɒTQadpaL\QPdKAu?:fֲoT4ݷ.w:Mt&5-jvPF]jW7.AsUցjUo1U=f]F8*h:n]9USb{/3.ڸdV>! I1iq[HΡǖ #"231z޿lL`CYl|9< hF_?P}y¶EHdiwbgkf+8PF,+9@9G-8ޔJDy<2sނݮtf?"x,BgrkcI<&ޱfo{.Q*bU)(?R( 4(tA_F!ySsqo1$UD \OM?_Y7͞G & K›3l#)BXMԱ6*OJ6A v5!.2 ZF=QV)5֧-)louۧEwoF ĒM1!8QKB B B B B! q]%Tde~ÚH 3` Np9#r|P$'HbA RĪsNd(\R@(P@(QQ 3MW='ԓ*暓͐-! xɠdV*3{rO1OT1@Lpk)LW49 #^(DM8d@@(DPٞ84Xf8^>R/PnVi{ӊhqpOT6RV6I:ze$X*h O⎃Gow]nV&H%8GsZ+ lAZv/ѩlpH\ZU43 ŦjַɈ+jɝcR@p+=KUѮ.aX vmz٤#1(k_P,Oο6B5x"QT蚆RUB2w7"D?<ՖJZ%)aԑQ/|$'I@&U2̮ڴ0GqNW0]'X6fQoE٘=D5WE5ʭut5;H?I 8ɠу'D!@q^zhN?jHdZBobI{Ro,riB\ǖo69.OA<0_M=d5Ҟ.z庛kEtx+j+wc1?a@{.3`Um27ky`܎E NYTAqEu ='h\$3ipK5҅ =J nޕĀc*ЦE>A˿+t[CC<;ćz1$ j-8v1SĂ?K FsUQ6q@"=/PpOjQ SbBX ڸ)XP挣7SX6$WvӅqAIqU,ͧC%*U<z JkjzdMn4W(wVQ]/檁P"6mqLΩFI 2` UgNRv4UnmUh`ԋ\+ja6EQ͢D&r{KQo}w"Q/=L]&)UTc¢[6"A Ue%}~%VBBb;g!cIOPB.PTڝͤ\'X[4;k)[K<.6dAU%vF)gL%>5+HӴd̄ ޵Nb\z l#zqR\ds0TP1A~q@X&-( YZsᛵe*H14b,fݴ3$2oUt`7u=Pm6΄Pcl惧ɰg?hZw5O8;@$QaAI6ǝn?\[Y(fWTЯH_P]'aKy4'4[%yJi'#5AXq#p惎'^T~J +\6wq&Liɫ%$O4p$YTqXްv?̸3;n6cYoNqmlN1p{t]!r+7TkQP) 8cib訝hMG8df'jW U皒69 hXg)\/^Mp(p;(1>\_2MzPP((P@M1Ct?1 xly=

hbEt(=` ,'~\WJwQd#lB{PHWBQ1z3",7#٪i6 krs?Pl4]ZKIAF1+@酙TSGc1o?.Pij3ul e5uoEi %B$}.֍T  ӉǞ)a A:j=wOg FPJL- 2$HANh=iUU!w{fqEé_q g?3xށdDO6zpOZZL6 |;h&S^YVrE'8+iрDiR֬89 PF(ځ4PP>.U7qS6z҃]XjWUI9!k ԮG66n?b!O 1SPiLhPs|=/Ibsٹh! YI?&0UkV``f?Gz _k&@'1W6s䔒VjQܐo3 jsHFeb;Z 埇/hi>tI`3{+Ii}y4guL6[XqҭJ1B ciQbw O e4 T+xoz\yr>]6e 7J/aAiCOj Ʒۛ5w|f_pWUzrX?$3AZYX)QҔn\; ݫo{I/:suZ"ԣq( xs*u>jym Tg5bOc}ET~Ҽ]f7ʱ@ҳRǀ*3\!PUDoԂ#cmP-#P9<_iD +6 /N|Qii-1 r4d1+ rWJ4wYb}I&%FcQڹuq\Ƨ \}&Zy3Fu>G S⺇.r;aR>*C:C$nTO0v+C Gn''L|['R/UMWAh=!YE+wPEXf~NBX~hxPEڸ'n>©5 F˓ 7M¡~d҃AlgK jp}Az=E@ k%iV%AoizE\ oHZ`CxS鍼FOZǫ66Aԩ>jd3ڢB+\C >hq3~1Yý 2a"v`GX#%rOwx{AyiP~qRNsEc%0\uHx6PG+niRO Eqh2e(DFR•),Bx(3@TV+t1Z έUZAOCAm>$,|sK]22y ֝ 4`AG0 ^QsZӮ"'a lccz |)щsz|6 >Om&Pnb8frE beIL? |M7j-mÃ\(Q )gk~/Nw$Z)㷒QMce.`eaP.vH{B+Kny61֚+2-81Qw[VHG52-^@ʧwc5|-PmLӫo)qY<@SHuvgnnJxFELa163/\fDu&EAQ+jӜex41 6K?2U}k0YfpLTy4'ASǫhlgo, ?5m+&y?yy|Eifco*tp`qڗmTig m\9&[Aw)ЃKeSGfby0kl6xc; V",ZXG Hɧ† Y-݊8e9"eҵtfɎSw{uJFh 8ݽMcC`l@#@fd Xd ?j^ YWFX)U89p9̚NKm$  [^͌@6:539=}bܾ$lF0()y*csXxiLs~$m۷P.y=kG(gҲV{A1yh2wnɑǴPj uSCE:6T,{4vG DsSog>_@6rS Xe # {'MhsW6_:X䘒ʠnHP\Ц.,iϤ-@))ӘB`1J}gi$cFKIQncu>`ȧbeNr\fq;2.ͼޜY0p:UUP*;&wN8!dm4%5("wi1hLjEbAAT5] JG)P 04 Ю.]|FU<h؈5b&I>a_?5EڀrjZڃ,z3y0k#0Zd(ڦC?2n4vke F q δͤv],d56V1*DZǖ>XmrP85e`u1P(hs 6?/s=Ev c761Њeb|qAfw9L,^"t`ZN A#*2XYL t ZrFޔ̚V3nL-vá0m=F:y#X!} vI'1=v{Q1ћ`%8iv.NGaAɢ_GO6 z &9DcVG#yemjl-6^ݍZ 41z3A%uՍp@FxRmsҙd=+Lߵu ;&v&ٝi~|Sq[;R3tLc(1V&&;sSN m jݟ&w*ǀGZ S-tmFXr5a0 9Nb{(449ٓ0ﺬºt{V3Ni>9Z-Z &Pj4C8^a*ghDFqx߷[ʙ#?JhP~}#dBz PRC =9HZKJPf@ȊHj–QF_ATZ-O|b;TH< ކVr3*|7IOm㳁\9^ÊC4\V7H ~q֥Gac${AdVPeq3sJ $HLSw)b)ZЈdI ZŹ"hV{BюB=I`btKFKg5?Sg'gdo5rPePp;Lp98Фg횜m~ Jhe -om8SDʈzVGIf'n]E> ,_nJ%BMֵ$FNxHKCAZ<Ӡt3im'ޝKP@=kS>4[`ck$A(=,(v{sHXm7^Srs$ c!4ީ]sRs8Bh'KbkD28L C)x) &}qmS-1ނiQm܅GmLxȩ$PatT(9@WXp'X v߱PEl%nv=@( QւKe]cSmXK'jWyJzsɥK6(ikmf=J\iY8 ?jIAfiR[/ 3EDe3#$$K}i>9y$ D$#z/.,Qދ˷\H9=h ljJX)B(1A7 ;?_s朆;fi\c>`˨ "lJ4?=Z6*Fiמ8 UP{w3.Ѯa-uVV#ւAYaf*FS]\maޢK5ۼE'曆tv҂XG-0 QݭZw?' Q\FOp!MQzٹ@ QvW-vmrՑdg7,%ceiz}c^-Sط2f sYɺ%}ʚ+]vdoOQb8/0-m"Sh*ṿĤgUIY̝8];\l8)?'zk/9dUDž-/Ir"]ԷE$$@rJNJL"㞸Ci$n@T,eTǽGuě~]!Tli(%[v(G㩠/o!]4h=}YSǥH{wB]q@{G=\lE=;N.$HNp@EQC/]A ;p{EVELqBI`1v}!ѬRT6OV2 zܪc$[iK'J9|d>KCFogVx^Q.Jߙ3LKrPNd[E$P2 Qs}"A*{A$b4F@^jڴLqIed7)[H=HYbK3K.tF݆hKIo|VUcgD!X`qSĘE]VGnC0bLy*ޡyYaA׵--Au?s$^zƜT">k)j2]h_iKkgZF@SsLyms4 r@5$~vQ J"AnP+nڕ.~(L =y恨Iy=:.TzsPFARxNh8K[[Y[hP0:mQ@#{X Ec[We\Sj߉l 81AO&IgGİծm'1qP.Mj%yCמՕ@֥P}V )%f¶h"V.BܑzPd$7GJ:- ӳO١D0ph9,f5u?0=+VVxBIU"[ +|BbTAXOAVxb1rA3YY@Cox+d[|֦8PE=Ϳ83 rw &#rh)Y{,6,BMPYhs v~y^wv+sS[- Rw -e]UZCg/s5u2deԕY\ˈFڿf.jEH=ȩW)R,'N h0)=ǵJhㆣi`%ݨ"١uUD#?z5ESE[CqH0‍łG=ileEIk+Nޟ)m =#oo4Dߊ?V 2{TfI<`bJ h4;8meˏJSy# >i&2I1*O3ZijM.` 6ቓ♎a4ZYn;f[=|E-8SF}}iҭD"F8995%;І<m+H?5E\WE chƻKVYL9#ԀFx>;?17y߈ 0yCkNHXydiޞLݞTw3hsFA-PQxIMgO{g ph֧zI|y>[MV(GC{p A]"TӢ]lcBNw>¬mXDryAڂ^G?y>U]q61A d6x DWMY .? AN%8wh+ZA^nL+4-i2vw3Gpsސ92Yɥ386*J{|C˔s҂ͼ 7⚈_,n]8WUGu|Z4-4|m2OtO/q\sWq^PM9'I #X9ێ4e#1 ~v!y1'f=9F4 5*oMBuܼinlđGjKe8T?j }2cߒzA!Sa4Etbf'#ڶNs1~eۨ-s Node-path: trunk/prototype/data/images/console.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 4450 Text-content-md5: d2906a2a0e7ed6f2a803f2614a703624 Content-length: 4460 PROPS-END PNG  IHDR;C"T}gAMA abKGD pHYs  ~tIME #}VZWIDATx[9dv]g>ug ? [j9y,Kr;' #B;"? !9{-];ԭ̳Gp+:uַkh_ ^4 kTUMӠ:t]ihu]ן}|O`;{ƍ]i"MS^^uIM`YZT5M4Mi~o5MM>°ou]i8f;cއ?O,D/!s˲im+϶m8UMPUdQZOq;ym[躾m[i*R+{3MI4Vg؞}/v]71 Cʉm0MSJ iaph$Bi^ׯ_׶@J"adY/=h4B(RυaV8AQ,Dڶ}l:\FKYruQiļ_r6 \^3wObMt~#m\9:J+ػ u7}^ad"]m(R4lX.0 Q۶X,Pl_ZۧFI}W0 AyDj(\.1L0L˗/cX`>Kc˲,p/\T๢(m> x]ׅxHNqe,P5t]G߇y(R: DEqQ%,B۶g䳼edm,a MSq+u0cs4M1Lppp$IprrȰm#IsEQXv] _meQ3"Yc4cZa6>!a$X. a{{{mLpRzڶma:X111<cW\۷wa\"ID"5y.>?TU,-X=kzzk*0 }lmmmi*,K$I"KQyi"I!c15?$gUUXVV$. phsy.)MSdYM0הiq#"i*;3[ouos}h Dap(e.&'$+!1}˶Q)7y( ض~`~/^.X,"D""ؗ.y* *"E\l&"-͈mooO?4\EE'G}Y}뺨 \Lo5Uɶm x'DZsm#Z#⺮yma8:, m @Tv8P6۶ŵp]u]cX`\bZ4M ^}X, } D*E!`۶'X*FQ˲ v]`I,]׭YvTFF[y#MS!. @]ג d M&1{Gi]מiB4u]#"),/{{ Bll,p8u]8z2VWu+Kq,"bbUE k8KS]^Op8r|XM8<,hfeI i(X,ebf )y%eŇZbI!%-j|.۶昃:}a( <2A7` >!>0R c><f1MՑk)Fy4M>އ!0FBbԀ{,90 !t]LR5\ u̲ͅLVn^ u(B$k#rN1@yu%:gC)U?i5M,DnJҘzB2jx})pE4{IDtuRB㍋X5$A4f='#!sQVu* :s1 $:aYXN[:%s=Hd_2_4M3% Su#鄨UDwöm4Sۀ.G=()m>.eyrrL&HK(@p.kԏQ4ow珏ax $IHeJ?bx?"m4www8'9ҠlJ55UռLͳ*XaNuǿU DÈsѴ[[[8<F< *olJUUWT vt0ĥKpe/~:cz=ضdz=u 4xRe59W  pțV^UUa{{sUÚT}U ~r> QڵkW'&Gi!yF#x'{nL_5(LfB(FD֏@D 'fU+=_O0 0^QOw%Hlmma4m[¨ʉʶB躎,pzz*/#Q'# }XV{*؛~mOB&e2;;;gggfDz#RٖԶܤ#b!>e Ȕfgu/_/rWޓW۶X,uNd3hb3JT#wt2oFv VlUSMip~~&A:⃩{ mYv/,Yx6 WTf /7eY] qibNL,ږ0]={:,V.F׸oX~&̲1M@irT{C+)6 oUЫ JӲ,y~oEozrOQaTUUUBT! V/o~& ٻ}~~C\qp̐wRIENDB` Node-path: trunk/prototype/data/images/door.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 50925 Text-content-md5: 6bd9cd5664bc5d74866792746c0a1bde Content-length: 50935 PROPS-END JFIFHHCreated with The GIMPC   '!%"."%()+,+ /3/*2'*+*C  ***************************************************"G !1A"Qa2q#B3Rbr4$SCcs%D“ ?)NEzWcMj{Vpk(6Hȭwcv[qybV.s*AspJ(A0QKy/~GJ\G̊1-ͪ03_̄";怨XقrRR匭 Q9X{VVPx{YQLvyKkAߕ5U4իD,{ FF(5~SmВ@!ֳ^1 PrwL ԫsRɠ&+4c +uq ״YYYAYYYAYYYAYYYAYYY(2޿窟V+Qh6 (=7̸= h$ħ&Z6|VA VQƽ<׻@AJQH, ycݝx4LV{s{H<EHIE6޼ ՕYZlBg(_rzYB5IԽR[FdM8,pʑJNV5zrn ayP]ׯ{Yo ($ 7MҘF bGB=veZDF9y[( Ok R4a[VVPeeeeVVVPeeeeVV"xRinb߽dޠ{#8fI4g!|i c,Ih1K582sV '1!ڀ\Ga#sqb<xV ݬ`zyٖix@@cdjck9Q@51ڧQl֍Nv^ b6PM.85!>*"1EgӦr$?ނ}'Gcް{Ehp=׼Ь{vz`ߚqf |[T/} )8Z$ܚW-ܧ!-oqA\~ b95F?kQl6=`3׾{^ǚ U5?(^8EmxhS">N/fdWRtdEa9(gR*;9 >95&Gfh#j"qBjlPCsXfh<(XOPs7 ΀kCMz"Ps >;NkCrO 5>jZm.k˂hkwo\UiC'iVB?|yK{rи | զn# . UK &_ꐕ4QRQ eW M n1K$lD 5eKf=n8>h\U~۟zJ8P׊>#WԺE8"S&OjX\@Ӂ6qp#?S& U0#onheTMSӁP6!\4߬C )Q'_~zrłb |6)$ _"85Ž+j[׉~A++(3|Aɭ$}(|s@}eWm^PBW'5磫7q4Gxd@2X H\mځ/.+S4Q[F~(;.h4i Q EzP;l"AQ@){#j$aj3h+Ӂހ/3q+cqS=Hp[]}<5mS95Ip ߾jHğh6n< [94&=?"A?BN2+”6q8[ݟ\P6)X0$x˟Qm=3,iP;?עE#9R<ͯ[Sn4o&+5Ԟ+0+VVPf+1YYAFs[VP 8ܤDy=h}dqZI{Wu'|֭+ur]Cd]w;ۇVS6څ@ɻ[#0jweo3ĎkU֚{ޑ_@WϕM_\^e5lF.P-b!Va4BQ%կ~4C:nqbk_jiVLv1޺nڤpƪ@#ɠ-e0#6PZnc^>.~ՂWs >j]gSM'M&3HZi6 "|ȫej~lۍOv?K氕GgSsbc>߰,cm`nww*Fp|is6 esmbN@$:KU*8+BhmP)E{5n=Vf5WQq2J~vHS iW4n2׀X=d7 Z1bFRrѠdER2x·E냔ȥ)pjŘZwG9#V۸#z}BqڷTڽjQ6 ݰMDcjZv< YP~Z0+܏&_ւO''R0Xޢ2LGר0̇4$uKF͹c@JLVPU&黛W U+7Xt1W*i[%1 -P}sd{jPH?޽c )qZ,AÜF+i?޽x(=ȭ~C`צ>8^hϊ &bxݓ)NJ4M{`qAv?љ-Ρt3$z* [8X]*e@6$(8aU6>gκ(f;S>~y8''l@Gs]]F3͙7d\*b @X+׽A2kC2yAp>TrO 33-JwS .m# ?΄<ֳ~!Pz@{9 Ċ1-g O0;v ~I|`(!Y(V= 1d~_5Y 6Ʊh,{9ꏳ ccX\HG! ƣ+S4*9 PM2?MT&w`V}l먾ԂaA٭D =ke[v 1^t#Gbh7[mVUnn~.܁^n>y鏓^&2~+EfgY+_H|gރр8&ph0g5g9k+(2WRÃq[כ(4ڼz2V(}'+yBxTf(+h%GJn wU{ju{: k2++<ֲ#bhXt)f57s!N>LT{LZܑA+a{sW@wMy(>I=,B4M_CdP=GMA5`TؿfRzG?*ʮ|bR~);mr@E>k2kW4VmEeGy~+jNq`o+("*pWdڥwZ޼ VVPf+1YYA^PjPz{YA+ k ̏ѥEPoYC>mPͮةǪ(VR)0DnN* ]eT$N7ʒLch/L꿙L+OԒMjkΨK^q4H2-yVZCf Mku o?zƒ$(ڶ9i%'ƥt4*?sA׫+EDsinsd( eU FԸUn(5 V ĜPXk*%*㟽HOb YYQMsZW ނZQ?*6TdvZCYŻIVyUi7ðSސ[<.uQbǦ,V1@I_K"[KǴ =Q__,_fZ{:9naEVN]ɠX;$J6a~J /UqiUu\\msSޠޙ[ilvndhcvcOndpY98si!X}jv$4p# _b>Yoe8C:KsuÒHlOx@@+Tx QQެAa13@oSsݏUuqIG̭[ER~3#jã/܀|PYzn䌩!\q}]xN:oOǻPG٠uUޮדIJ#^\ iqz~q:mt-_IrUO|Bi[9y#!#='ToS- \ *һ'NiKi1ŷFX TPaQL5E ̱/c0j~a,$Tsq}uڴ1 [&DuRxG4۫9MlesuZWҖaG&fi.wn,m"j1uiEMZ ') X>(k0ڨ3G ,T< >?VX@xU*+ &rϚX ;Pt%UEX= L,Ȯ,b!8^a'?z]̢?z~TzBtMZA2'h{ Rq}0u]<0!04x? iz) IN֣`3{l!Mݲ~+;׮dx4n'A(2n/=WrfNWhe-NKoG}'_i1*HzKG_:I5H}4vRk;GRCzˏQkv3d1¾bPr1o'pqA[9?g6qi vz>Z '7RI^3MZta0FqB]뺼S)\e(:\'<`*sկΫvɪG;ٟƣH=<[o 3/ecM?v4,!fOMH+q:Cc=/onh>BՖL2(w;s}C"Ei$* [;z: ͟ C4O#AɌNO^d<4+]1mKszs$kV₝J$s6;jia_o)eXcTQj61@X@UTP: @F4&<aj!cizڭsʤh"k'oͻ1HΤL_Z$ZS_s,e);vj~醴[ӾG;|; X1ͦ*4^M8~SWc; {h=Y1DrwwL^Ď)$W x)V$欗kZ7Z#%˸ AssGrib* q^hin[$|ZJ\>>h {SuIE&+Ԩ3 DJ)^Խ=[ xA]Kбy0huKh%+ytvS{IJ5B8ؐ2ⷲK#R[wb(+Enpmب;FrhQo#Ӗ ċ^6omza8V% GVWVcpph9ъ IB(i"} OVC1 &` d2>*x䷙CĻA;TR\N>ޠciu:I!pSA@$w6Gu `֭D#Oޣ IvN9Za8;Jrx$L7|"kzF$ V@"B1h=PztjJ >94]oIQUyp kD2o]PR%@l8W{,%mً/s]!K(ZlݟX6P[i$3A A&Ckۻo}Dj9?4UѲhyʒpx _֐9<~_{+0F=yk?EL9Q귚]qAn>cGךɊݚF?~ԫHӮ5GHmS7%OY-+NA?[}^&d'8aڛM)cl$aH=u_"aV-+O!#/;}kkXH4J[+y&N?ދ C#n>j=VZ$J-[Хw4P,R#Tv%LǸ4MzM7#/302~hc[t@Kq}kxw_$P6ˑ^˨#Ԍ*F p+o{yշ &!U.PǦ %Zlf‘;}꟯Ziv1¼@7Nۛk/T$,[?=XM%ksc;:{mX }$P(/{q5/1t)ي࿇IgZާvBMuĽGZX,(: V~p9Eom׍YwyIom!iS 9'u.Ӯt-2ĶYYYAdj;^5'W4֊Xު)4pLpIit%q>xĝj3((ZhS3Kw[Ũۢm1.7I'6`} sڅK(o`r@o4yQ-}$~o<ս@>jF@w/~)N f{sMM/ pFQ@$ZR_Ko'w^i>Ւc;(E,MGWq4Xb8zS;hx6dw&fSy"w9()4$bs4ڵUYm|r0 =kf^7(l>¼Ӧ¡cvC0qXrxOIܙ?(4SvC ha|U˧^9 ^ϣCq)<₧qXȠ;Qv Dk5vF[tȅ ]AEӯmTGjVԬ؆GCEY鹖P-bdPZ(ހVOYOdV(D{B1jcC-b9<ӽ[:\9Ź۰Pq<> ]nF J?ZZd!AȢŌe=9Pcujd^Ic B:U*4g!9P92*.vS;f<{-A'#.8#(!F&T&PA:YFtyohC3Dĩd'! $ ~‚%v l:`Uf?]vGj~q#333MW;EYElңKx`Ұ4n 72 `e4 .{R;P2W4wSZkm>n^ aUr(.A>LlpF繣H^D ך!mrh^\\zb_PW~ic ݑ?R:D6ts6OA#_WcEI3hw'l;AhkqGzOd. #PP4fXA`S]9&Ukr!G2O5-!Yg݌~-%7$..]_Vijī#8ka`\c-'kPei, Lp2MoT&LK'wPG5jLdGlJ|qxc +)yO%OCmV֖gm!F|hۙ[aFѨT eKgȠ&@'T=ªT[ܩX#h[YFuP>ᚊ]60eRPZ6TvF<#= VX$ ڒh#)21FAmk1[si@I"%QKyU&%*?ڤT҄__`x Nz3hkB>3G Я&Mɦ3;6>3RMiNGp3G`<0ۿ9VݛknyP(a9, ^mk#)G8v*!^'E$SZڜ+Iݛ#ܸ@@7%+clݎzd91G[:^DX}7䩑k}/QgFxiP@?>Y#X6prqUΚ,"7sBT4]I}U(@X1G 8dڼl C{R;ܬpp|Si'+hj $6! T?Uw 0WPǴ@ZuGea >= tYt0\67 %$Y0P +C{썉EC ifI Ja\E7޺]oXBeEsoCJ%S,?ރ~ j̿1݌sUtN4'O}YqZTf jz}ơs.P~oqw}NU7f}Et(l,aJrkZE%rGaW,KHbP=|iy2^nIw₁mKv^2j$e9-qP"`w恤 6@o]v%.ch;jY6cXnhI$=1k}DEUn5i\;ǜrk`] "!할^{[e؝hJ}Nq7976Xpd)o$W /aڂ v0{TtTH]DvP*F,9OIjxℏI@wzͻ<W`=2<aF5<&MF2KS KdU!j{ӶNX sSL񵘌ĸ}F@#ir 2j9 ċkՆpVdT_P7NGRVElxzO>_UTBE<{ژxsK-٥ld |Z恬ڟ*ǰ}We$V*ᅲg@ĉ:d)[!Y]{[2:NУ8Q}U+h 3@xԏ&c#BSV@TW:'וo%|x:ÍP'& kL{P}y$I8`?ivӢ@f?J׵-&pIo%.ڊ i(MNP iN=ض4f|[;t-xX~5@ˤ Q 8:\RÜϚ/xDyǸV"[{<.2Je(eG$AigwݙWj>(dq2JeQo06_n:Ĥ6;ziwvګW$(B4.RV #bMMs|ZQ犷޾"N#+dyسgY\jn!=*mlJcvv/#i%Aߚj[3l!!#--E+]ŏsNk{Vx'Og׻v8 $e9Ǵ|zRm,8$>0jƤ',p0Yg) 0QNzbn|dUk7̸9*wbݕU*7 ;>h+4sǨ c>*O!]*b->M_N.۵fle|bM:m)7F(hXO哓X3զvXZq͚>6!c ldP3V_:ʦ(ɌPv>}zpŵ[[jۣ(.bcKy2h}B[eS麫q2A hַF=Ku`9@XN@(y mől Fha=Ϛ=yrsmI&$n>- SJTX(0Oz; 9 e1E*VrFiPyBO lM|P1c"T $!e 8;TO=|PX*~h'}xp /i,c]o4r8R6"n0JP7OKӦ)M֓ S#zZǽ@ ד_*oɠ6S`s>/2= Oe=ꑨwHNwr7^r(;ѮT#lsކ) 1rsz_^Ew|{oo6h-Yw r(Kf7qkY[p;/( <ʠ=z6pi3]czg84YG @j9Z:RXaP3m 8tm=.n2szMjOǧU.=dž?[սF1HK ZW8 6N_]9FkpaځEƪc o;KئbFu?&:uJTYіOqP']P¶{`nnv*̻iz=1EI٧"FyO=$r|QváIBH C.v8tVqq!4LAjqeِNw }և6@y㩺[0@<h/=>fݫީ.vg?kBQ[DTP?ڊfh9E tq=PU} VY5ltGL1d94vE!9i{%Y3@jk7lun@}FF G<"zJY׆FY.u\\4Kn8-P#{ulwpja2 S=CN}Bxۉci-PiJBO/4s0B )K^1*O݌$X[i @H:TqJ~F9\n88ȨNWFX`PV!s̆s2k@q5-ڒ_icjPp'YG=Oi^^MdD08 ª=RڦM{xLq2N3Uã:k EȩoXZ @Q:J#AS3>9>e%{8vq'P At HVI$$jæ#|nT7H$9 .q Z3 (ڂٿ⫰%ɓJӈ-?EΛk93闓ZM N6fb5.iyt")!dr tGF/k46(* ntyn>ֱm #9}îUcEj7]@JhQwKehQ颌H#C 5 =( PŦ^ T[TJi"M{IOj7$=&G恝ܰROfR8pK">iE#0QB$,2!1i=ƍ؏Xi=2#78>r)`2(. Hn%t8i.Mt]' ‚rh+M 7ZNPn6DKy?^X@T~T(6w3 I, qЩnQ@{q3"D U@m?AT>GNB>w@AUJ1eE%wtmx5ۿztzW] b~9Ͽ ;]KZ7J~5B U`P{YYYA%⋡o1@OK 7~" L-f.KLW#kj?S *_Kv tK |5얶64^I$zd2G>a1}c#Ɩ Y~¤NAٽYm 4bNV3@ԉ39xAe5I!oϦsFA$?.X eR9#29+!j6L!qP)`&Aw 6Tqu 9r&Y6>orc6d?<ڂ~EnFBX3U?t)9RA)(#b<(,{f8j9$W 8R):IP NG=w`NsVo({;idc~"hleG_t۟).ll~+2N1JgS\E:H/0+%6F9:`PHIk3Fh_RVqn8&ѐ9Zmt kw'"Qv;@ #9v6bEdv-&Z\:Y#?'p=I{%@pkiđ ;0 ]Hcnl2Lڃ3eP 0[p41eR<)m+Ai̭ R؆F(MG>]!4EӖ&E nq"p80Yu(>EV=vqTݕ3<[kʰ2AnM2+39F͂)ǖjL4=NÅ9;,1iB ۍ51+xW?`5ԄsP_k57dsAq6\+*I4XGk}1YbԺ!MF W;7QY\[jKzKu$ۏ*};іqL;!9z^B "̇ZQ ;FF3ԶxI{|ku.خ {cQ$䑏4.*J}~* {kpv>3RX5ڄHkn$29F .~sHX@َ;@WQjʦCig'-ӝvދTOKrbSҵԖ{{v5G1QX`apyMc+[dRTAvnv%V8qi^ˬks.Z8{ߵ]u;(E>}9^u޻,Ƥ)4R#,J6m ?j\v#pbil۸+7GGֵ]e@|ciK kԍ)oJ- <YR=9aJ4 'eQVU(3T7&ィ#km NOs.sߞ zQ-1W5.._TWG4aHD۟Ҫ=\OSo0c @Kch};8S*;i5y>;P[s\l)\z|#=}Yx'_ZXF\tdjc#]7-j4YYYA!FO}Skɾeb{ޣ uz6o֖`^ ӗ=ivz{iﶮvHҁ@ŽơֺFrgKõohVͭj^hW.[@}khu-Ad_t_I,7m? gy.=MC[FAJ5JWVNF AQ^=kI{da rv>r}}:ܵRr1^?]mķRe;Ֆ`R3⃉vBt}c?]lzsJnn_v4O…=ơ#+8Q\0dv*i"+2S W VvhG\\z:UDyt>kp2$Zdυ_v.FڜŻt ֩3R"֘(uE(ehNr; f \U,O\ʒq-r4\#ݱRQyP[ne]QR֝opr*x?gG dpޣ$\h2K"g#fՕ+I,h Szcgio,.Io(.Èz#n\QvW=ӕXPvx2q5NG$;」c ߪk^7O7fL"q@5(^++bIwcL}NJ٣mdzū?R5$ҳZ[~iE*K2B~*)fpr}9F6ߟCj9Rm} bkΈrTk7ݞ8iIZB})h}NSo'&.5c`8p"aNd@XllH$SoitX{n<>xZ }0mӊDWĤ)9Nt7ZvRFF ȠX4놹+rcFXPV֓HU^f$$BV[Mo1R峌U{ulÄ,J)k}Ť#ZgkSaAe жho(/LI:7 Sb~+.yOb?@~{NGsUu_(e%Mz-xHhB\wS5r91xNSrY6V\cj[x?"M2C3q :>lJ͗lrr(jPbF8TV㏵[;xFUF8XUK]iQk:p%n^qIJqsT4UrޤՈGeAq p)Vqi|2/uX'##5/Nxr9ȠLԮ$e'**ۧq7"+d g:=2F@Ӟ8='ꮦKv}|W0ӵ^ԶS--*ˢP}VJܔa,t}>b*CӖ/JDT6غՄeYS]N^ag Rn`K\ϞL7d!VKmb |w4 C`ΨcAUg:4`8:Fϫri~w˽qF(+}Z&d[prăߜWMt;-,jsdF&ªWuutmb{l v Oue?AT;ҳ4_Fjjwwo%!UG{[M*,j" gT4A!%r9RI- ւ.m~z2F}PKҝ;q'P ǃuaKx ZZZEglDUEWz "hc`e#=Σ_⻇-ŎUy5tRQ%" ;\g꤉oyӺ,pOzOaI|UByH\;OuOi6.#P@=Ƨwe hU͈hsyj:_?Mi;Dn>+Ft3,/3ROå#jM,|PlYQ*u$7Ag-PCs]/GVxyG hmaoNdg~InqL;}60(ms^ѬI\ڙ_@֕ s3PwQ.KCjq5gӭNk&MEQڨqVJxQ_o8,{fԮU>ۍM Y,B8IMޛ|z5Țn;Ԏ]Fmp{6<7GF^u yPd$ȴ<lT,,8RA6@6kkItm X:ᄓ%-F J((45-,=1ڙh&["t4c*j!g!TMFGN28q; nuW?u/=k彜Gt؜r+ۆ[L`?zg1Ԉ2tԳ$}iw~iKj!(ki'acL6< Qi0$1=?Zm0 h^j01Alqe{PfvԴV?#;G涅Ms$x4McU}՜# b7^_Mk2Ĩaki˨#}^+GGqE~ڟ㋐1"qVHn17匌z SXFiܯ~@Gf2\pGӍzrJ֤]@4%8.X+s*β+Up CqJ; ZeZ gr> #nvWzil^ZC PX4Ԙ+PĆR[ɩjR3Hw6i?z]A'($pJfcS,Z9F!0x#k]Zc"|zf'pS2Hn~,F#^Bua Aft癘H>iNk;Bm/M|`W'`FtqF&IOAb^'1#&bán<҈i"-"ASi:?ђ?a@g(LG]6GXгIuG].\`?_6 YkjZɘidz$Ӹ ؛e{WXCD1ԑAa>[Syt q[/cQ1FFF 6ؕ RmZZT``>/LXg5 ʠ6j#Q-GWQg,Y[ 2jzZYgZYﺪp#,\QAb9& @Lđxf To&}3Il{I,[2Nt]2=Ң16;E8" *(\NLe>>{PcՑ鶍o^jW" .Kzx'<:GPP.']LM高AC$H^1#& 2&``^W7i 5.ieȌpL<@=y{% *8IYQTgOv%;Uᜂ:Ưp^O <5ΓK_^{,㕦.m[n;rs #+QqA$1sQ\:o[{`$6EfF;2$s@Fu)R&[,P P>+k;D|N5-L65Ì(EP mmHi Zt殍<+1Fiq7%@%ھ;7|'VM?n"@,?~> 1Mwκ1}ޙ5M%n% h.wQgҳV:O-z~K6s3Gښh f$+-iQO4Vp4B"Uꋣ9Ē)(kK6] 8[*ǿDk`"D{ScMhO¥ ՝\贯?h?i$aj̝I}5y\ C]wu'+ ]:Ř// 틹 ; ]jWKs%e z-j%RvVHt#pкvHHPґ+Ɋr5oMwӥgQ3kz}7cݟ4}A++$1Mt*+%@iv==GLUg,y4ECGjq;izdA؇Sy%b6⭰A+jTxa** z_κmpx6l>-+q=VA-+P$rV]qpXޭwLݤҜQ}*4 1o{{|qhtyْ? 9KAb#9~ZћI\"NցRI';\ YSûk5{N3m\/W 8\sAnUۜ#%L@HK{|Dbނ wPW[&1x cgHFO[ljv(ťtOw~(KačG?櫭Ey$&88/< =귦[X31}Vm/Yx,60 Z nXb 'YDTP "$WlsVK]/Larzh-َ}a ЀK_n*7 *7rm[*Ai\{*ijqkh-ⶏ |Tç[p8i'RCZ0Cf(<;Cu<4 ghg>+ZG@[VQ6FD^g8GX.[ s/sccށ'Y_\]*+,'>GKS,I[o]m#鄉@ :VwR] ,H4 23U{,_uَgp^,w}atSv5uLXPPE閺5 G,OT:%+I#p' TUMt3/qk'o&D,7a=^M<}e%vO5aԵ(4VV5]bJifp0;UFuqpe nwno۪@r~Mkk *(mKVӣkA- %`>l?S4q#bzQ ,`å@Mi:LE0M )El}x4Jfן׻%##ytČEhHH? nG>#7^EeЗP@W#ڹዩn$.% O٨j'!wn2(;x&o+tFMm y&HXc A&odn.Cdzp3?&cWmqeA.RQQ }5P+ &57M}%نBA? Œc" Jnktli Z o5Z$Q|qŌbsAhقŐ@@sMZ"(wT:#* H᭧i;!?ނ:p P3[ͼ\˜HyICaok+:~WfhBkcȠ5c*[-@-]q'uI{BT >3\Ӫ&#_wiVTsT>lRK@ dLS6.#mKky9֗BӤ57a'oߑ_?)ZrF>Nh:vS\Aod1$*1kt[3JⰵEUɠ4\8<@~[iv,( p23\5gewnGj_=[WGؚ]'4RSQ9kha@jI a 4UGԑiq!m,09G[KYٯ=" PK0vXAҳ׿[i;+XV8*[Xt4@#XijKV[(A"k{Yǫq)P&-ËO&r 4 E֠2;XD_ڵ;HQkưijNAƇ"BOMR 4Յl?U\G( h;AocidP*Vֺ]Vz6Kޣ5jn!{ӽ9oLܳPf鰉%ac0iv/#0, 95A@r{(</B[Mʇ(!tΥ][m/bj[m UVD5@zf 43XRI֯Y>¢.|}aC@$p 9Laӭ!C4^DG[{bK(N2[liZNFN;qA\bpOV+贴 `Qr-B8/ÒP,N^{hNq۵s«LYTdm~os)?yhĘHzcK6Iª'udY@@Wɥ7Mj׫jܨ9D#@Uϵ[85}"W ɢZ@9**k@ҥ׵Cj vh$ޙu ߜ?n,^(bj)p*N,40h4\ėw3HPiD@5Qp7^Q&r~4nQb~dAځ\[HGFt=9ǁI:7I;pV~ƙo ^OCT|nyo5K4-9p1ڤxViTʧSj&wT2ukHu(cLAo}W,b́F''΀РbW1v/O.d-AHSr"aɧ=7 ܊'4`3JnS/S21V+cF8 H; !3# )/B0wg O/6?on&hW*#Q<ֳ]+g2K#h;Kdi<@H3%ެQèaȈvkkZkl)#V ]3Ԋp*x P[eL%Gj\Zɻ$FtؖKXNS j"qE m9S_D!۞5$'jY7^.=zz=ɓW\rPXvU+Q홀۲h5~W@"oo`}p>{>#PXz.5(IGhX^}?nܶ ,<QޜuBI 3u t5};zN{?eZ\J翞k1=/=?VVVPe h{8i=Wh䵴F;\}f#5S:V%f'|O4㨴_Uk4qoV8#W:CX,wsj.IcjH%֑Z*p?j2^ѡ}ڌwTR8?גtM\TO|h:Q~&if;;y_Ҫ꺉5F $tsY$8jkeP`ǎd~ tQ3B?RE. dLgzv)w({sAк窴[nRkyH^z/PiFE|Kb;qP^hH4ܮ9( =Hͽe{zu$N) Z_ݙSv@aڕtOnT'nӤA$p @Ǯ  ^o2oŻ 1>2iDZTVvi.Y6p P=gL|nSKԍ0 i$ށݽ@8Jޞ%ĒO< T,d#P8oq6bA<TD11 M-ZUX@H_FkV=} ,ca5DomġٷSt2wl[5Ob'*M8č>sljߤ0 n$MDo߹+⁇Z!ZQܮrXޏԖqV 2wm?&+w >#@8"u?JZc9^M;=mMo grޕD<$%ck4 GOuCw-R2 \aҀP.cfjΥ$A>ҭ^KiGIG7o<JI0MIV1.7PtHR)lj[Gk9^t|mҺ $ Dm>qVs}.zλ@⸌Eb!V@+;FqAn:RX)i6GqD2)SSڄ2(IT惫%k6S4W#GE*;smSRX9`:R6m]仕)`vд9cزnTnxFYUQT!ݭ@>OjW1u6 HR#y'hAV=gV&NmXaP4;K4ء#Qb.π; F8F雅ZDЖo7p;J]>O*.Xɠ-UHef &If؀+Yn Pn9n aX vgn<v/u*}ϯz^եd "5NM{$ɫOB[*\\YI/A >zii>@V%@׭]1ש-pu54;Ap$Hu;t"IqAo YJ(cc4m`ey9Wm*75흱矵)I[Y&~C.޷(m#.#bh׶~hV (?;@AZCZ>k m_c.[qTlǭ@2P_ UW)L,,M$ B[n1ۨ$siv}f!aڀ9Os@Xa /N7d*& %N8`ĜOWROvgɠC 7zO9Sզ᥽by'7[5{xq4R,˷P#e_rj+]YQbpJ WFƚb.^ .V+{M1?zΑ]ro GI{.t4@Uj[(֭MEXApCj'|ME3TP/}+OfM ۖ1 +W2Ji rJ,&|#xUbs!Qŀ99(={t_Q:([\KH|DA\e|ޣP۰89l4<_p&]f[g{eLx X\'Hh  57[EF3c"doހ3R`sSGet,>Sj1ۓrH4z﵌ C*]I#B=$v.;L~] HsP7BeBǚ*-6DŽT-43zzr$x: һh*(.'GT8?Jݭ BUX5)Nex &x1P Jb`d\ȥA<Χ# }I||M"Y$m@ Q$;KHXF%h"=C1hܕh_w"" 'ueAZBHYϊP>Fs,n+Ai gPj u+{Wʩ%`ciD ⫉U +7r4 t6sM6i$B9Iw軋Q'/֯YGs@Pu;ޜkEyo,zdH"^2F޻DQ~6r-!y"5v; TK;1}+a6Ѱd=Cev[.3r޹rdpnU^h+ZL{U`qꥮZ"?Պ$]ٔ *GU[Zm^Bǖ8c@~$ugIڠY"#ny$K4>P{{xLPYA]\F%(0uOۍr"ފ-huv8ͩ-b pz=$I 6ߠ)]5{9&9d,Wl>ќ ++qA,4pf/Xj88W KGjVߴaN&kKD ڂ>^gs b xeUf$۽XxR#3[;51A9@1L&[sԍ1UUOl >h!.`8d>㹾hE V+;($;$gMF8t6d'vx4NGy'>KPڪ9SaQ4B&N0epcLVOg`&YBA;Q)՘LH8)gi%  sZt=40uHGe"h"Oijd?h bmR&i=*EUf^2b{x1qm$GtH]zkkJֺ WL"c*A]tv"GぜSF;GF޻5ܲ_<.>%5i=#0wLiwD)PڮwTqA$vؠ1ѥ@hhk%U8p@?鷌4ZZpdbs悂5m5ܑ\( 2v@XfSOz=HNG< .&,lrbh5ܓAGs2'*lH&T_+'xq@QE Qi]ۘqW+NIw?&*{o<g&vۑ >Mbh IخVIɡ&{2qf>w"&JK]( kFm7a8 Lv#m<;?jotcA-ë4Cj,;|] IfvQܟ"=ޚi=8#%p2J Cq .mAX4fdQqڵKPo5n}I0p(ONR!# Idvvn@ Hqm+g`1.AC'DE2O:{q&1@" 9VߧtWjݱFZzDd2o>8mMڹ<,fT#xXDR44ّ[&*Bu&zCh%Ԯ -hfH(g_O=Ip*&T#E+Uy(l(F$Yh;!b&ekz\W#>)__^"@j>Z*'#@@! Ik肪syk-1@HW/,E޲LM--5K9P|y҉=V>1檖C^C&inS:-]?J8geR'&!R ugo%hZ|dGZ]Ұ UqY5cVY=ZBx,^-5@>ؠw*+s@ɧ%z$g]/N}qf$2! HPr;n%Y'y|(RpH5զ3 9xUA#PqItR[M:w~pݍ@<$v JPw9cҝE8E<G-["8ZM«5ߜ8F-j[@m[e4 Kc>Xs22?&-,(7i$O"4 j?jA_qV+:Yt#%q2A'ZM !ުizhPg5sHUhPI&~Kkj-8zc!T[uMZn.TW65ZI~,=E<#SYWps^E4/H!MQ{wkLғRãl+l /"QF >s1I .G}r*qޫꍑo'G<eycC."tT Sp"+G\\0\Q{q#1 "Ɓ#6;UGPY-m|RK|mQAi>g5W] D#(uZuj<j4eG6ﯢ-yW(\u l"N8ZN׫V"BR?\P 0 -IW$6ޏCu E9NBWGEx U>FY$bBpzK/J譭on Vu2\hF?j$iu>>ss)MQi &vsXv-q[F:#$5hwa"D]% NWt1.?6xE1%~+Xt j7O}3I"J=ߵe\ xt4x5pok[1.AK~t#T WupWf8܊kI6P~(*2tl0h1bw!Ujn$ZGQ4Zam/As-nr9+\"()^)09M>8AVh'FѳG),OM1HƘr 1}HSVVJC1OSCqf"S,(͜d ~Z{KY3U.i6F(;fWG,PZU [AaaiM/d#dPCM|֓KzAÅ_ҽ}Y#,$nꑺ5[k%F~դw&OJ9nc@FhW& Q|@ɭF 3|`GQ,3jՄR.Hx%~) #(Sj ͱ;,2vL ~-܂\VMcmxKo Pj)o1E⥏VW yiwຏT|[[jIڈ8B94&%pZkrXϥ8dFsAɜz]s"psɮ&D>/\-ugZiaNsA_6L^ ?8 ;d!2IQem?JH&`@"PrFTcWu;jPGۊ~J^T~X`DLށK%V)iŮ{Q#HzO E* \aWȠ-+c0ҹ7^Ǎ\XK$g'+@Y 0RwzkDntfB7 C[ ǏzGY[{eG _:tv,6PMx|ӽ7A}Y}#95$[9'iF(I/?ҹN2jAh4~nTނԷm_"xI+95qYպtO€UZ+s4ٙ~4&3bqڋT$mJIm9uX|XiF{Bw#L YNx> U]U4hrdn֢:%Erc\S>X*MG[-eڑDShOkbyWFs<_us+5}-X*qRPeG??RTw~1ZR3AhLyu auvgӭDg,Fr"Z3AJҒ[1t697200j'{P?pj<ځZ "P8?R.3 $r9o+sR-<1撽*х;HZǍ6Ϛ?On+x^' H&Df縩f lybųjRr|P6VBI9k/l"YB\ԀU0G1jRfu]nsJ5K%3Aj#'޼]fYk(`k]˻c?4IS7TS(+dG2BqA>hv˹TvPIW{8p26&N6K~](8(EQs#cWr0;}nɕŨ-\Ozfg0gjLd՘@j}L[`DpB2,BH{5soj $BA;FF E MÜj8XdOqA~rߊkb&|*cuFW-  uv"1*鈦A骠 ֶv!<~+{X26[iڱ$ ;An2g.'ƒҀzW3ixr(}ʫ-ĤsZxQyA"XCcnU2K!ݓG,vGqBA~8v;[vXև|y5 4 m 9gĬy5cH }V22zx$wU∔Bx"x'1ZrTvuM hQ^<N(}1ڈyڵ{vV.Щ%ԲOɰ/#݌\P /R GvMXF%'#\ZSMmr^uAD3kR뮗կ-̧pIufA( BJu<EB.Bm+ Q] GڲKaA K x^Lc*+JDBdlg w.Eh`61ޤr8E({˙+DgSpp(ZڸV885C2']~wT9" "HKasVS4Ǫm6uϓO&I0[ZipK6ܮEouꩻ5zHKݛ4Pm`<_Ymoh/o#,GD l :Pt$,rqNlzT!I!ev6> g`h"#oW?k[PGČ nݣeSs]=P\'8vM}B07)4k! B < <i'|~dZ{40>₩2ՈiB XIqlyxk9 yfWbFUeYF֠vVükȻ3A8x͍u0A`psBt3|Ik}[<1PbV4;l C)EeJ(k.@ށ{&-+Y癀YڏgS ZqC4IH_pqQW @4-Ƥ |^lmxj !y!~tBEA;prIC"_Fۊ*[@\DrýN%|aA)Ry?5#\`0FM؈F%f9ȠǶ{g;W+4G!\<MauPݷE>4n|WYd32G&[ȢƸ<r++ӲZK$#3w$Wfahi'HWǚ As4>jM '@lD.0<Eܳۖ-b  .F0M6:M햲eKi&pB(C`" !kY;6I!xB q*:.Rڱ{0 U w8V&\dړKetNyP)GPWV!h(rHH,'K$vD$EA:,pI9j tD2]_fN?cG?}٠:k26F҈84fêXE+;aߧ "G 3iY\u4>j(cT~5#8 4]u4 wP ++(2ok4 B&7魦n\.!ܭEoFȞIj`ڷ@?"XL+Î&%pc"'-8cZG 1,l;"a@:%vN|P¸=Inܡ qAȿq#0^)6VGvX\jD& ߊ9բG9;ki4zޡ+j9ု#O$17?EVM/f$Z  2\4j[$4ãLqJ'hI#F靠 B.zkZW-'Vym#mqڕR6c$Vq3D|d*"N;R.1* vJrIk5Rm?8hTfcޭWXKz _ ud@f `+k0}6&w¬}S3< }VQPtօ23(yɥ^XYr );RNq xX(iaڣChSy/-IU_hĥ4wU`nsx5Z9R8'M+v]患{q_դBO4;8Rfm ~Ife ~(: Hg&G-'"](< HfUmņ{P[PA0mߔгެ'Y:ܚHcDUG9k&̫7˶O=Air)3Y>ܸͩbkSy46 1OiE$#а`s@$SL[RWx#FEf{>zquf&YS\Fq@vWgni]$S^U~P0#%5b{O5FKoAL͔'csU's2k)Fawg*D"a =[Q?OK(-1;EԭqEh5KqȪ6~1;ϧڰ`{⁵Pw0+޷MfFi,o=P',Hn7?Z XAZNdFO*H)+M6^@IP{%G$Rv(EEfdyAaz" :)O,݅r+)_!a\ `FF)GQiZޑ5 YlA g94P,P 5bꎎFyO8ȪrZ1 9J(3n<__ ;ۘU>Qwv,փ!g 3j2I6?>R*э-)b1B.ԒT~;Xu_kG\Fa^FcDrC]6"j /.⳶yp'&T2Uɮ??RL ,S 75-ܞz>Sd{?ł`dO\D^ Q(Yn3A fWRx8FnU%#e|-¾1^,Sm'?q[-((}{D(eu6QDʬ8~J{v:upk4FJR`sZ"zEFP||TBUuxȣ%8< RĿQD0Z8voxJnZYV~I95/ql 9$P41wGI`g^hwb{cia 8S1v ګUSY6 }%X^kvGbv]C^Ft_Ϛk=O?(dK 9y=&g٠icex's:uλvANjt04Ocڬ/X @rHh: ޏݻoX("Zeh,3 !_ 7Ya %nx6"ޗgz8G8{ t!$ݳjtjq6dVH:{ZRcڂkUxM.S=;gKk-s#L4Idp8&KKHBx8[bBG:CC u{)+ -)%Oޙ˦ȱ%P9M‚H.Q"yսz!5ĉ 1;]B0d9bR@NF#5kPCGlɣ#[\0~Ht{w@ ? b $%@kPv|TtpjcM#`O{K?z-F9J%.>1Mc+&憏"q 4Z*'ҌIG>qQGӋ o{ ;tݻbGjM%Q6ġ}UY%'r|C>¥Yh: mE'\dQzp[CCj@̢+{P%0hU;U{4%]?YDE۞8椒ݘJs{ hPB#5KYB\1ȬC)q4cB"!(g,۶Fhim4$pG޺YDEhoL Rx"OP$N%x(\StOPM,E=>@1J)&k- F9#\!yZ<*>[2AW>-&( uI4eX CPXtzRQJ d+jzDsRe[Hu/ĭRK9c`n @!=6jpY ">ET fn[ssUzVmB(&HTF3 ɱsh1.Qlxkvcx1sX&W1ݨXW{hEFR08J(ͤR3|ӽ*I,kP7!ѡ~q[,qmHݸ=khda 1@uG On퉁Sޏ:k;nw(kqKRI<,7ܨ?]-=N<gy+ r($nG[%-P %m'j2{.؏PM$pIJ퉇hTV-ߊtwɔ֦s[kcN qi5c qIcɒCcnm sJ}i#uhl 5Kbw*Oao$l-j-x#=-/s ,H=md ܺ& xV3Ff+[K (0h s,Fz=5]VATX^@,@R 78*V Ġ|VvXA>(+i,E`()t&YJ%+W;j9b#pUAVozV[K#s@H.tQ}-ሤ& 'KHؖtѺ T惕^]"1 qWgɴlbrza:|ʬ Node-path: trunk/prototype/data/images/door_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3304 Text-content-md5: 04e2d50fe2b8b93cf67ba2fb9071d388 Content-length: 3314 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH oFFsuG pHYs  ~tIME 1tÕ IIDATxg%UaE DEQD1b#D1`(`0 (.azuo:unjcO5缵: vC<2[U?9HʉzVA,uޞ$E;-,t+&[ X^8/mO7۞.O{ ` 8 =n{W*P.<% ,tck`޻UK P.e/M\dᶧ{<&[ ŧثn(RKᶧ[;W*P.5Sᶧtn(R`OympY5n{?u[w @ .OmOw7MV*P(Ro< tcf=nޭXo ޘjM7 =,ܣثn(RW-0tcf.;0U*P(Rox[pe7n{YG3W*P:;afᶧ^w @K{]Un{?uOYw @zV ۞o}{ޭXlOvsfÝ70U*P(R0նpcƉN`>lOv^7}bnXJ,->6Ѡ5&fK}2`[ҍᶧkb?F`OtSfӔ~uU (R`&>3putO{nuY P9 nMb?~>mu]P(R_H\3Кnn18pnb.,!@/%pmO7 ث+!@JuAnnn{MKB,%@_MpO<9^]`o_O\pmMwjޭ08O`) '}+f5<,ܩOc8/*ӭ.$ wo7$ZmO7;<,#@s/*K3(b7&zoKw{cӟv9e{(@ 4C?pc5tc1/#@j+?Oo>nJ۞n~ß)[Z P\'[SYYfϗ] OۻzQ-\ h6>ݴ5Pst=ζK퐟?tp6FoU:0-#b]fup.Fsp1?gm,,t~26orgy,> 8Q6ړn =>fuWzu'c5Dp!G F~g;'n{>lu>8hUy,Fp.w~lutcs,nBvN1ǃ%mxԳD}y,R #p.OdᶧÝnqԉ}w/*ѿV8r I9vtc͏nߺ /Nٳtoim@p!G &prfl:O}uaS\_w{ow۞~kE2ubo}GM_\[w]Ak/iLu}OM_{+g5tO-Y;QOwpn ZӍᶧ;?ݾuowG]{'uonY㦓enGK:(eH#9(IENDB` Node-path: trunk/prototype/data/images/door_obj.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 19070 Text-content-md5: 6f4fc4e4958706de46b22c6ca6eb18fa Content-length: 19080 PROPS-END JFIFHHCreated with The GIMPC   '!%"."%()+,+ /3/*2'*+*C  ***************************************************"A!1"AQaq#2B3Rbr$%&CST ?%-TWb-e~z_w%3AҳځL7wuPn(DKE4jPYn !P1F\|PsB ?Pkb& ?4^\O5N$F@gM !2 dYA|V &EkpӊGɩ+(9YAbYAeeC ےe=}UInFZnY($OlwA@jEmÊ-v/j9y@ O2LaXH)eƕ}"JVbcEjcM}(gHjGp Zq3qYG 5ɄSAGMoyɬUok;oj}F-s5L#ssAL޹k–֍f $PN'iFIŨP']sAڄHB˷a] +l̏99>`v&ծz[mY"0R<(+$f⍌WPFF] W($l+(>oڲ1Za8[fW k2+|(N&{kA?[g>EtwoA0}xXozf g4Y+un#owtkXqAYcҳ3[ cXTVPuYZ;P|iq@]eWnzDlj zjʮ'^UR@jmi_Fee= @%s M|F| ul5̪/3qں,YD >_{iKr jӧ-[Ign;LHڬm8h=ϭ˼rh}S J%#d/yS(c?c􅭔q#<<9ARC9MW -.Iu#wW+\$j0qX(٠Op1dӠ h9hĀ 9NrKoʬj6Ba@͔DQC0*(NsVia0Œw u 9+\jyd(P> hrN82ou#El-FhLyuwel϶,A4 Vi.bB-Y ړ]ie8o~j/#kPIF59`D {1洍Y3NV:(EoA~#y?J JU6a~> ɠDzH= LNy"\a@ FG0W8o ;pv4MEI_cA_pn ͤAIԺk%BPxnk%v;/4T[Iunc`$bջoʡW{2$8 vNiB>2z V=9i<YAxq|uzFB(;@Q9*y."G|1K"U|5B 7mWi$a*Š=kBq(@ 4ڛ Yqo h{sj09ߊ^鎣Ô31#8, s᯦7a TQw!]Eg =8xR\Ns4X:JGiq|w*[սiQ0>3گ}ݦ`F6Q/yŦ Ɖ>rǥ[2]0UܹQL 1X;5 B^I%;Djb]@~d;E sK"cZQEvvMbI `;sI)Z@2=hw@L`k zqH:+MqSVJQ}>j6ntK*}kK)oWA&Ӄ:$v53 XqPL8.$Fzi\3D9, KU#^K!˅W  u!k==]~jw] WQ4ҹ9F%nI!"}q0V1ߊWz3ň K)4wIM>Rq^}{n#x+?WIV?9cin\#)!6ju/- }i$^hj ӷұGmϵV}A?6dOOC[Y+ R۽AEJyͧaRE_7?4倵G"KqxSZ,єTӻq"-AXMGX Eҵuk0ۯojK+↸O8ͻa;PUο hAǭKuRڐɸ,9JGyh}͏@{T]4nnfi ܑnuJbAZ]Mu$G #"yl.2B)oiH1b>KYP)۸niB#gsC5z[3SM:/ v ԞM(`;߇~܀2?z]my Ns[]c郗4YPTC dJYa'Ҷ%҂ m޼A, < $6@'44~.bOs}j{e>s>(96`@8+ aNƺvU3Hnc悷E<71̛\O{UsQ VlF;h=$*?cu=) ͸1oaW8:ޠ*s(m9堥g4#P~|u+$')4,rcLz-*!Rˁހ.mos0Y,ޝG%Ai#dM?tżI]=k4zk6) x})v3$-A/K;2@ΜPPE?4(`0C4_ږcEF'[.2$G6 ӔEIkIt; 6#֍GȽ ڂ7mUc\R6mKm-gz{֣t33A$ZfۚgGS3 /B "Ln_sL!g@Qv['͏ r>sJK=It;Z( }پ(g.|3 *Y"0a$!Ԥf#j⎵x*?zz vVOC4 s\][1Cj;H䛜c{.ww4Bڼ &z2^r#<+Oy{m&ऄSZzA`iC[-,#pd}L4[pd%(mRf,! nxs0rbH$Rsۊwɠ ^Ug~zڤ9>3°ڴfDYeKdݞ@4#rD=LJ?Q@D7A Zhb%\{ЫK ;pyΦe7 1($3k-1Ocf1H2V$o@8$99D,MҢENp;{8m/5 x8mhJ z e ?p*ރ{ gԂJFd1G`GAHY #i J|;Iɫ  r"6 7gN:ޛ6a1MNEmI vb'b!8%X1"kLvՎIVtϞ߷jMB挞 9ziӺeESqP[tַnfѺmӋ36Mߚ]lYK4=m[A7aL9}/zUivMp#bq"u ]2^P ݯAC1呀lt[tTD cwE}}({ Y>e(?P_WGeW<PRt Pch)-dUp]J@1V?[ ;?M("8QJVa+rz ۭGa>jlY2(+TV 0҂p4=-TCyh+8!E ~~Kz+x,*ǟED%Xtm:GYPϖ+92xs՚3}[\b'wMwCV >c4_t\zyiYm߈vJ|7jO'ݏn(=?-H^.XN?2w0|b$Vwy@5ibhM!6%u ;⡹֒c'q@K{k0>KO\-O>fH;&y܂rEɠKTT:AMDYژAUQ&8c}qA.m%̷2ZCi [rk,3I ت3 ]ڦuYY'ָi%f.$]FQ `a#г2sR;J x3]81ΎNc95֮dMJhsY4c7"NWڂ$6AB~/FUn ԏJ?:H!flxf d:|%!㑏jzFAq fԴd1vbT)QށwT6Q dN$]j[-K MPA[\pkwVrh[,Ao +F@t0C5!HsqC.QW<mn.@"hĊ<ϘRm*]K$ ^[M17̻$bXI H\|zP5A\4ݶ[1.2sKƛ,Pi#4v[ @s0tU!;wb%A^Iʹ/Xyx`y,s;%@y0>*kƍ6lS&ԔR( UA #((ёDR@݀Bbz jS3DATʛ }*~Ws5ƍ#[$B#P~h[D nIvljI&C4[Ÿw2XݛJf&e']ZYE&ĸmv =Ci9JyLRIאS>_dTmŀznemHqUh&fDlz*;Y 5u` VpZlPIJ" W{ы\F11zv:1l=!S8c@ -;Yv;Sս)@1\=(]^v?k/~Q6-@ ԓ~H,..m mODuPzZ+.PPKO$j$x5" $oW N g(*- 1mIc6Ɲꟗdo3M&gՃn}aP@ uHQis Q[ I2Do- I&iˍ͑K(%}iuŮ# J3@)IQs&R.0⬷DRAb5'֒%QLK7Yb*-Z ŮI **l7zWo+PkG jƹiKH3j}3 d}ڌhJ0{j OVX_cyJ${"X*zRi2ҹ ufyc~$w;^INɌFY̘CedQ1 XdY4( +ӼEWhEW̏"FIG Q1owj]ab`#m8j=}"a9Oo_[%""F4 AxI#Q AfO.-vYC\jSE3[Int>\$(g'#hM1c}plDaKy&K5ZCڍBŃwh/7?\hO@&Ρ;Uqu E8eR ͿRIOe7?.ȊMž( MwN9.`4wPBiϯ7T5-6EZ(r8sC3[0$I-0h90GrOz\M3\ xl Ro&Hoi@e< S5$[{6p. \lV#Ƿ<ǯr9XBA(ڑ0og:\;{x?QB<}_EDh`/,F1ދԷ6 JwI7ڂagr'׊T0 kd@h8TBX{E"< 0Qulch}b$hU= Vw sn8G)m@3*Dn7cxՈHz.գ@Q!1o_gfVGH~9KtR& G:}Ҁ C %w95)c Jp5,AF'*r}@uV E3@L;TlF*-HvdSdxejjow'3KZ.BZCȩt=:;fCJՇa7CXUL枋xl D0`I{ry()m ,pDic$dm94CEnnFȘ>>jz5&/QysJ""oJ\Jpv^ I0Ӽ NOGu6o nsrHճz:VjJE(;MZil ޠ7ZZ[\kD.hH̀vt̑O~E BO^I4by-87o~*[nD՜ IԺ^Ӏ'p8X'ۊI %\Ƞe#j-#PD1xfIQ|CsAT]Fi{02>y0B}귯ڪZ2^N@c y*&8A,lE(E,6UO ;j"nq抓UFT( dbrq.NM&_Ky"mNdHGbs@'zIZ&&Cd꓃A[n(n.?Ӭ5>kK?0%=V>+9t U.VS.7e\͚A\f ST3Ԭ/1E:7%eӍ4w`5}R;;c{ވ_8vb3yEi$e'>߇G/F+ؖuF8$z s"a@#ulOaڕ^uF%;z&]Cv>u<6Wh#ԂWBX#MB܊Ls2aǨ #(eCR]TƦ! N%PHkCu#(e8G2q@) ̗xAF}XTTFAPw#`QFx54_Jܑ9+cW]%aPyln1@f#ڙ;fqުq/Inx'AoH݉aAvƲK${TsZgҥ5(ҹM6ٚFP ${ۇTPO[ȆxyR# ;*XjQh3ݎsA,ćI!Agލ[k™(:Ku,Z^ Kmn9"Fhݢf.0Wu4VXN>b]RTePHT.0kqcrT *}*;@TsAN0IZC3!SZm'#|G▭p@LwZJ;$MuƂ#7A'`+.p'+bfmJTC shKY"p72 Y%ʸHIj_ܭ,bUz[y ڂw~j=$/ukCTvaRV2{zQIGT:G6r@>o38:9 Ko|d|zšd2}21>m $f CKvV#}@LЙCQݬ0rIZV&n5)uT1 |'pVAنG*H,7iAhFGQ 69SNidၴVuǘ6x# U~9m#yPEk~>k R$ \>N'TҜr' M쐲|b"A߾jKcԭ#qR$=oaAY&6D{xYO>^nQ-ԪmJg螡7 fy+Aync };%ЦF9տ ![B\i3jn-IڻqA\ VIyTɡFx*g}r|( 7B"3AN 8yavDQڭcmKd,=Vۣ-[;Q_ :MH*lxoEb^~,*d&N;TSut}?"t*7Yi֐-BQ$qWL$Y m!(*-պ3!j  |uFZǡX \F+$ɴGf/ViYfuީ޹u#k`m[B?EAi 7Š/~QVP'4AԠr~HrMZ.?tƒ[$WaF!XYqzրy/mf HAsޭ} beFF ޫySH ;t DsǭbhXy `5.?nH*`?FV"{ޤx[j6ݱ];UsltvTCjݱ\~((e+ |q9oڀ"}92+u?Dpl-#-&(l(+eHKW 1C/QC"m\]'I1VE4ΤAd f ]٥R2MEDJO%g|z0%Zee#SnEQEbGe9Vva0zP8/cE`BKgVG T:{7+>}آ@жvrNTXWAMRb3l6[[n7qA,2?T4ˏUb .fMnSLb@Kcv;OjmaT? Ѱ3w$8(̎x8‰!BCWqUP6L6J+pf|dyy 398T$)=57,)s+L̎aQ}lq@2$@쵇UBBOo%N;\FI'ָo=;}BJdUs Zܺ0Ǘ " \OzR8Q qڻ?T%̀o GzVi/㷵j<6XK+i2WvQ#@ u%J31'ޛ\Wܸ+h$x=N$xW@ ̒ڣ=n[br|qPek0sA~*T{֐jHJ_|%=*Ӏ+yZe^v᛿t ɨ쌙qނkm52TUXnA>jn1d${p-Hl4XXP&E=kf #v/!0#q[e҉mR٭x):G~MjkeDB(u-ru 9P^LڄĹ?z|Jn r ~~n伱@3ₕ-̎_iц[ sLwH;H݁\ H$k Lw-,])eev[mN)ƭv-ǜqYYAn{ (fvr}++(# }h-"Uee #KGB8eeذ#MX#onEeev}DCed:+ x P4b0E2#3A1jdP@?jRK bׯ݄R2}++(u .T4\Z& ^<5 ?Qj)U弓\[vzz#C/.c,hYH=ee Node-path: trunk/prototype/data/images/mointain2.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 44854 Text-content-md5: 628805e8085e722511909d0a92dedd23 Content-length: 44864 PROPS-END JFIFHHCreated with The GIMPC   '!%"."%()+,+ /3/*2'*+*C  ***************************************************"?!1A"Qa#2BqR$3bCrѲS4 ?lмtN*HK wSIղ!Hީ˯if#;Pzv+Ke;ݼ EY-,ZA=+ZiK+0U5\?E=e+͠}-'MUp>(FUΑ\$½C3һmϟ Ӈ03@Kwn!9U$C)&|{M.[^6R~jد4$cNJU}F(d`(wⅼ)$ªEF;%3[3>jbϹ7/q g!$PIs0:g4CwCr3'XEs r"8=sidQ4::ُilG1f_'Q!v$acmik$xebCp|Wz>U{v) }\aV\qjCK~:Poc0rGfNѵw Ryn#;T䁐*'< } Ym$ n!@FVZjL${AݿYz RJ6rZ1u rgQgIciӻUݥ r8LP0No޸H.ZqǶ˅DŅ}LK2 2 z:KF|8ksл8,כ܊;ª?ሰخ+q\Jb!h/ȩJ]pqLW*{05Rh%J1A+̊j`Mvk#&&U{U3@ 'H5AdqAͮ ܌*2r+HSڸh%i!\OpF`hM680IeJH K$\@,'A| 0WQSx? rMVEA#T9:(ᓑEqBʌ+* ( ^k RJ RJ RJ RJ RJ ޑ$^4 Wh.'&q%Jc@sAK'ALt@1EfoGj` hASMi=+|qe9w1F9rYJ(92av[{,6uH,Fއ%ƫ=8Esj^-3xah"ejބh PŹnb ǚi Ն'vӅAQѤf[H^AŤfUGDoԸTl#Scm$:q9CȒnUh/]H *S{aA7Jh~TadsAPT_?\X3Ay;Wh;;y!Q'En=\;FF,p*]$C¸h''ء=J7'^*s(=20y9|׊T/I>jEWxG+cBGsCϩ[ 'v}ۻoa)lPqC ,3|UyS1sPY-ʎ8_smqp>h59FV]wM;{(cڀH@?*nK.q%5),X;զ ow>aPn~>(O4I|Q6к'i(ɕATIB[1(;_nNwW9ثGj*G葊E3YTG"7($w4ԪzWKxJJJJ&tY'1c RD^*4g5siJ` 6ӧ![>j\]u ePqH+}i<#p%bZ9ұsvbw=,nh(7nh-@ 3\>\L"\J%aޟ5V M$]:Ĺe"& "]>-}+’^! 9Th {Wvm~idn=YwDޭ+ Bߝj'RGu$Wd=1YH&$lmb#@jT!lHJ >i,鍰',O}dAtRZvxG F[Gڙ)Ku <ׯ=m'.D8Er2 Ngosb:FGj&VTNKeo>>^-ݹ4P0 (,*C{J˕eW}#`+{n@UB9csL#X{p ȜC/2۳3@x+fa'pm74KY≺[M7m@I]w-teA,K0*?VE,vmp1&63G9s!,Wmp wlXȠRՓnK YOV:X]M@~8j$ rH>雽'LAm D Y8RڑuF'ZMt?W+~$&:y5J8w Uڼ prq溷cSsn'ܣXsBodMz!~@MxC|TF8 N@gVd=I.aRPOj28ȠKy2b\/ #urrH# bXZBCv֭g$]*$poW+ĩbO?抂(^3ŰTP9v ڻnsW-A(UuVC 9ea]E$dǁ@Ʀ@DK)'FHDPR,k{5պSR7]j72D]q<[\ಟk+؅<Dw4[E;s0w3`p M- 'o$5wAZU$hi\~T"Gl2@ ,YT"a>(=MJR<)ަy 4 Q[n)tdmPb QGsMes# TQn8nn=pJ<頶-a/ԩɪ-mETBޫk&Q;T0{W;r*m'U;} GzWGPuhp 0uR0qWBbPܚo,*mF1y^h#.2GN"WQy~ ; :g#VGjWs@)1`ݪۉn$܌bICe~N#0"+ۈ=ޔ~MOP >jm_@A$іQpn[N88RKC { -nMÃcsAqb>TȬai!3pGIDEnmÖ.>hidZ,_ej1Ue)♉Xp@ dgT:P*릻Ldx檀W9PzKc#Qu|@7gy42A_Y2*+$ށĺ(mƥj$ su|V:Zns)M~R5WSq-!!V 5RaYY,|rO6iw\@`s̗6ER٦b]t&<+ ghr%-I'#4Eįc)N ]L2OU|B:{ZlYdfc#Z^WF<=ʆdl0b(=RR55J RLJJ RLPJ*y*yA*TA*`TAShjdPy@^T=n"h=LRs]dT#5Ɍ&]9RS歩A n@*?5 MA! xbF}k G @R݆鈝I"Mi,w iZt\L:?[[H,{&q**#g}Kk;nA|U޾t^X`Wor@:PXA,WLVb]7*dc@ރ|~惟UȖ5_NE!'uj}ێyAAB?4;HE9šNbYp΅vE٠ gSX:Fy57IvpviNhi'w 3' Ȯ0#$b;i%)|w ia^#LH55M"潠&!MN O3RKe y 뒠;1SuR\}*WׄV!׻W2G0AڂҲS{]R2 {g!9S^ϊ*uQ4@q5[d0w5-r[YbpP}o}oo+r_./s1˜@ 86G&ӦEaFcKPcYK>E}&Iٌ~x@:o'$\}=a)'RۿZ%ŤAp-rݶ01XI4OYV=5M$9_pgNՑ(!-X*FsyAmK39mg x#.ŏsOhIr4WLd4cBϿ IL+A{ *8'Ph,Xxuō2*'R ّ 6-sP=>Ch6\O߷ e̓*C9QDDwlvqo3P;bb(ZR']iX3&-d n;ۤ2 co-R6 ?דJGO ޱ' cޠv`nޭ!CQTN'AѴE]+TYw`y2][怹bW+ 2p#˾p 4E{-;q(KhIY]iEܐjOoc& ϚzhUI1;ݳ&'",n_BXEG$D$@jFwЦ"2]Wa Hs |7vW^7 XE{[-ЙwnR ,mjtMNR$U{P&1^#o$7cD-q rqC]Piae|d6x֗z#]"qX5BmE!H.|D#w8-s> $!`VRD|zmռňWV}[ +/z+tQh2ոK)~IUlH@846zsac@W]i7pv" ( Swh ,!rh-"TCM%ͱ r RL)P3T($x4a|UVw2.C剭"D Inc oPLh@m:`Y`P 3,|8*@fm*!OQ16{|WqndLɏY[9I ^xSJ+ kE=Ǣ009czm$8?uUi0Ǹ'eӰX΂y$) yu9h(>Zz]"p9nExAz-TEgQ)}0*;Fh5^J+GZnV` 5-SP<\͙Hx}R+:X7e??)T1w M:hnIj뚝8cb+CfH;QwsLl#?l~ʠ(RD 4xnik1`qZ~8X#(,k8G|sU-9A?0S#hu [g1Hj̝6'%2ؓډkiP)CPJVt9+X䁚Q#1=~%Ka>qYڑF3ڞMڇf<q@_F2Di h c'U~FgMdQ6F $DBT@#b1! g=%푻D N ni#5黻hHVnN3⇚-'jfGAl#m19$w¶Mi;4[WwU;-^x'"_Irx"+%X('5>D{Y#I2s_Z=S7&}72F#|`NOiQNv&Rd/ڀTƦ )cb {Z}#݉ԛ[ަŽn0qUHDk(m:7#^X!]FrQ]O{xP.yo$ FT3Wj,qrFFϐbŹrX8reȻ䨦1*#KqQG rqC; b5(]WY1k/q=Uyl|P0N [%xo⫙qm35St~ch TCE]D )H%4`)$W]c^~(/w9#I܄2ڙ^_"K'I˲٘*962۞{:Opk4NJ@6$:,Ф 2{ОiAb셼܉FD݋j(Lt4Kvd'$"I+{[|{Hb|T(,?*Aq WmI!Tt '&N;nn "K)[bTHͽ̰.f檃D@mUݡEPU1YzZj:s`JNQ B:\Ф60mc-+D-2zZ0Ki X]v|A-vȱl-Aw35j(eSeXAű?z &R1]L Zt8i7d-})-6@Aq YEL 9;\;qm2Rhx"W2sɯe6> 灚,b(P ೀ(TPx=ԫM#%Pf|/h Q7(Z>Cf2(tc l"_8@egv! ;D-5#nCV!d*Bc>5 trc{4sev5+ |sHIз[&Qi $0 ,r@nʷ.Y5PyzOw5ИJe|( f@6yF}'⦟?YQat %_Yݯ *m a <|PǦL(0rh ^m]ck~6<۲(3~z&G9L'2,e;E(VP7DJ2 v5[JO}Ē! AY*}W+PgP$}}<8-B1_\ZQ@+ކpI}"YC9jk`xH=+IiObS~rHp-V(AAK6!ISUf?v3 =Dmbeq'+E5EGf@8$"]):2+pQ0Ws'ꑸ4GۊaS+ fUWu1IdLrxe GCAo="qn?cCPt$fBNW^tзmƁȒA޾,,?|kNR3+(Ԏ@VU:TXUl#Iq[[NMc$ܷ3d  6j vڒ M` oV@gM> d vfHH݌YkmKT >/'H=E2-TaA∎%@rIB-Lg+h $?6+ฐHO1]ɌRxvP02)ӉHLn*JGQ@E.ē5p&7e4 2Ne mXFr d)AG$N#NwF)ޅJp4Z ܠTzJ$>h] {IKN8o32 gWB^D_up\)Z2ppF{cw}DUځIF(cP3'ŨyGEiñ O>k<񽹎?S8.}5TYoCsO"4;B)M,ϵiI怢hH<+9c?~s$g<` ђ=ev}ʸ5!AH}*ˑ &u 8(h-m5.-2±ͧ\(T7,8l8sSaA퉜,4@YYZqIfݕx&$9 l+<{(]&aXI m{ya3*(#i"v5q`9@ս4̖s潷$7B g:IDhxiKiz=9*|v1VKQڻ[)8`϶kbоgj n!mh$lc+&#kڇcgM,_%vI`OjMtѳviǭs0vqV^jDZGV={ВzXzB%8o4{\SmJ۪}aG,9Չ!Vf1|x}(.!cѧaIjzb&PtK7HyR5ܫb[6P恎C-98NJDx-R{UҠiNYDg=섳"I< 쬖FPiIU`rAji"8jgEjgJX}eD#P}ʦhw ھg8H/P< T[Bw4q&TBzg<V[DClwXm&Vf {aWJ\ h}lY4QVOԣv coڟ}3.vzInየڀU[xvPJ\EK RMÜq R-FĄ>]=d+dҭZ5>[?⬗jYddpscJ2khqcmrI52{hjNXq]_ȯ=sWW dIb Oage|w8Va њwڌhcaB>闬>p@|L3 #tVʃAw|F[fUPqkr1H0jrʄ+[0zܤ{wm9D[ [i-v8s޷YPU$7H h%CpG"̥I[m);5č)!upêpwPtmm͑ {=(f*O s4d@v6eWthJ"ԒGզKpȠf?;f$&n8j(GVg|>hi?@q⩘dC-;m^eאVo|UdeIO;G0߆"xْOQo!϶Ń^n"[vEhtYX]p2e7V0[O5n..qM݃ M[FAqv~e s o˛Kdzv$?Q֟O(){-iifwHr-GcػWkO2k9qv6Hvs@7R\zv&`z~qcO[k枇^J&,s;0֦Mi< _{Kh_dQg5="XQg Knkzٸ(o+Ĵ~J7Qw X7x$:[Pnh80gwqȤgjR%GP4r\Jm k4e WpOlBICf =6vJy(sӧB ~]s ) v4L*pi2#䷼2xR `liCjebO=鐔[U!X `'$޺lNjHBf#1ġP_aa$Z3PӃ)!!^ʇ]jKnvO8R(9 l!;!HQnL"Bñ+jD6nfȧZRO6(8\qehv0Uȶ޹2G zi4sƄcLsnc+n`,#QS(h2z2M(,qzOSe;h1TAil*KPaiʣscGԒ)qƗj+s?SJ#vhU2kyhQiQF {ځ=eldvW)l/"?I kDRKrkB;HF}|$KH÷#$_aӯ` @ H>?z9&hzbG^E SHĴ Nkg Y'.1E-̡D"#Gf^l]x>Em-V`:ڏL̴̠61rm`v(a^(-4A#ℒмoէhAk+I*?M E#"Ǹ 1v ⺿niVokr̀I<&UҮ bw.ۏm2=$QuRQ"y=pO֘kI$Vk %X$ 9 Vp'#m2HD#xZǃ,@5۰W wQd/ +L{UBdg@y ]o9;04d8=(*={{K!$WQ4oN y}P W}?p澗r՗"FS7VxAF31}F]COyڀoJ1X" >\w"~C-Ig'ap-+cc(8b;w]p 9bwP^b$AY\f!$\{9溳1hP+J ;ਗ਼Fg 1A\\ ]3%I@tz XQ{eS^oa!`#iNI 1tЍf_[[q'W3H_rǞ5x9@d]7ndd`;qN!{p E9qY_PO.hB$Y4K'8gQٸ7:H$xDp3ށ'd-X<,)궜́fֻ.|s)m1aAIp4XZݷO@={ >dr*ƁnssEOrbeFеi3$E+)ay^{A$>j& Nn>~bd8'9MY-ߊ(zZc(dN[I2H6 -Z7!Mj=:mR41meڤt?jTg}Oy$Gf Z6Qǧ^VaI/Jj2dހ0y#bx<Xù%1kW3Ddxgcyki$([hL,j8G %<~oxHaNѐ3zmyq5q; Ǿ àgfG v`VP!i(r`łp(u#>Db]cqIMy'M5ۭ=t+K1ĀҴպtP[X-OTzrNރF=rQ<68dpq~Ds\l~h5w~ӥHW_5T0؍CÖ纟S*8Amj=bk75fMLv3V=夈gRcqA,4gr]ȊcM*ӵ{ m?ޚڬM0惫Dݝ,AnҴaݛɡ>l`{bPÊ e-Si'jLvAqCԲLEĪx#vnH@ 24KTU%;w8'zW0YKӌ(99`9dErX O|'mJɠmˬ(b{0Fw5dP7RČaNk42GEHnwi48-&mAMl~-{(|Ѿqu\99b/>>h2g퍡F 5''=DeIޙ ouc'9#3@7mݞknz1唟4t s;PrHܠ#hCXIXn-j@9 =j>"9nC{BH7yqr$A0W,PX2xWjOlb!rW_; O\nU?rhi.`b4P|ڴ-#}6Ȫ;9:n>G /&,׷#D'EsxL1+\Wiw AgNViuU@ID6A]vFB]ũ$K2 5rM744S ri}D6BsyS-mW}X 檶NeA89)iuW(*.v]`W=yVf! y_5cRGկ]D#HhF bl%ncXT qKbh,p.0Ďhl䑃@Wۓ"ekJG(<+n$DrOcP 5̗Qn\ip1VR0oЯ,)F[[= Xs5U"܊jΠڟ #ELPiI\'nmR8NqV̱)Y[R,GFјziUwjm2N_8q=/vgV/l]:rp-V% }Ew]Ff܇ *Z^u$Ym~y(.^y w/1E"o'=GO PgӦ]1V5b!Sc{j&n⫊&xM?r8 : bO?Kn dbOs81F][X"jI,:;\ rk][EjBKM. Aթmfq?ji@F3Y ROin#esҿ{>9.b<YZ{ZFe=Oa%f%'9)bmT4릷$ʤM`Ӣ,d挊\}3P_ +Jz,dPkJ V>[YG4tqҁTwho|UNePB;P"Kr@bO֨0[|g럱WM$$`ӈ\Onʯ5f ca 3mhsc/nkJ:9ꭷHU)PdM!h9દ I"Pb8- ?M[s2&aV;FI\%RA  ܄z]Fi-iK?6C7j9. &.^&Af Ѝ8E#1RDfQ~~& r3MղWa&}p|,Spr()R.''|)&pLjg qܚcr?a@ala1V[@C>PL1| هh#9"0 mH ||SEX rxXnAq=/bd-VgS.UǓA1GLJ[Y fx߽Y`Yp E~ h9 H׫ lyC F8mI=e!1daMWwJSvP>ma[ \K%mk<}mC.;zIfP]yT//ҭA\ rk7vtPZ]SXwŎEwʐkCo?ͩCuۜvm BFYS+!ȳ*J&=CZ`7|gfll"#qAͽ&*ĕ?I:,ى06 /d!|Q܎Gj.(0tب>У] AKm$faM"xC> klahKX#T9ՑMfulW+.y8"$$ jPUck$ᙉrk-# oG&pǚHE ߏ%-</!.3m-ܗIpy )׵)(h=BcpBN4{U #tNʣ8I`y]HMQ4,ff'qxF98SG;;:Qwva XBuR0H@ ¬@V.Aem+c.IuQah+fS(BIǃ恸e\ͥ6U (t;b]6\|cmal hV&9Xl~cv!*剕TM~Q#D&4{qG#ެbqyc@lOj%@6%yXK.u5NԜ(,gx_U4 )Qyإ1Y/}jr48 wbfDnn1IeнDU|ԦBH h{9纲.T29>J*9\}|rs$_X 残WfLGFtPۭӶ=.BDu$d5ޡbjvaSMZ eh٦Z|$+݋vԢ91#knCNim.ۉ:n}}([Ue ыaVG]uiv 4PۯпPAZ&'W8PJVUK_ȱ؏].2iX3A*Xg..B\k.-H{׾ӱjENpUm#lnC^˭ܽ[}.t?'DlAgD1[Gqь񵖕1p_8X$Zi{±V4>h>a ƔO4vclrGO 9H9b0DzO;Gzl>*w{y(£(wy}&I $s^=Soۛċ,{Sy#[xh?|P- O(~kʏFM=i$DG$뻀6 {NkE&IzYތM I`}){E=>ǖ_KFq++~Mi͎2ɠ5j݋x"2~E}(0vSOFL@3@@AP⨵q8~cl#^w }Y&I\Y+ {٣Y׌աt5Ș" 1g(2$JWh5G` "Ħbq7${w@ UL+oF$_vI|՗FG @k;7&,rMNOOo6nrH]e(^¯8R7:!RQrh Oct SbDl9ApmlTGx# B~94ݮda!B qLrx4sj)lx4'VM,]9;jvMwzm&׶@Prz~ҋ@{ޙRu$I!UݍcE 1_qcQC _#E(z+WqLЍFA@-Ο`  =.({Ye䐥ehʐyNJaj%&y?Ρd%Ј=מ(iLNsDdՒKwml6< woK8(3@Mq@ eV8^^艀yȦ3Gq$pC9"H[ (>i{ݳe \m.W%HPWk2A $ڃ]mww#ό֦GbC"T.B)Vr^`e iqllr(ŵ(V.,NXE4%ȠfSAP⻍1(ǟl61 ߔLqP9?j"Wʀcò ހy elNray}QߐDr H6E'/&S#-<(7FZP}eb1E$_D >Ɠ:2VH;j8,p=9}=F>9!ž>j5U/5H3A>6(B ⌲I܀09jI6rhڇ1„;&—rfFhEH9YV_ŒހaJ&31慍8M8eK-< IJ@c+7H b|Sk8HD "Gm=P&.4Fi9?"4彲uCv @G#!ڼf4Q޸6Ň$ݽϲH8ﲉa 6Е;PHWPoiex5Kbpk+Ӹ@EͫʪȠ:;H]64}\3’&؃m[7M$AM _s"FqȢb&6U-s(;G9䚭 =qF] `ƀ68!26x_5r G'!S[GIs,x=-̯u sR|3G$>% 59L(:P|}8b{e.x)0wOKѸ0JTImwQ p~MzzqqXޥo]F(,fj._*yF(fP:28TQިF$M]}tZ||gmeSKiNq]sO&D$2?zê>1NnLMe҅C.f%F| ͧf.g4$?sڻV#cp9-2 ⁹>Ӄ; i`{FT ȠnIBJ +[Ap4 Cs]Q:JBҒF1FUdiڞn#(gadWz쁝\1oAnm|T,f#IpЬfw@^ƀ4zI',1m@il֒pxZ (` q㪁@R;gmpq}8ܤ+XRp>( X`( AG2FYpE)Flu9i30Q3K Xȉ/YH8#BD"O>wdFI 0O&:'Pv{vir Y!im1KGY$0;DjC20S$ZW#Ers1.{)BI.63LJ03E~Ǐ]H#ޣQc'#⺞I!!O}4Fg,fBx0$ ({[qwTT*>#KU+ v{-1||UKc4ىBjTv!1I W<|ʻ TAf۸)IsJc>'tIdrn>(ekX{hp\vAj9+kTçj02BPgQI@Q޸ID1?*].Y506(&ygcCڽ0#ړY*Qzc$Ej B#P-i L+Fwv/,e8%isQC , Yd2qF^F!`0Ǎ$r c橻h#qm,Am!PU ǚݦF8s$dhN0ml#{{:ӭᲃʓciXr40Y /&#@3u$"i4Fй$Hjf[ ̻UGB$Cw&Ik"Cd=-+v{$ "m 9o!z{4PI$7S4 rpGIt0{F;@7E/%M;^7JШ84lڍ1m׍9j4b`7ԇry7h<׃NY\JJTw[lsxc@PKQK8%i*xH-s&Rn@H8cB˴$gu6k.O$~f+ĝh4r},(m̈́E\`Eg%8 O懕Jpς~آ#S1#gbzt9.NPdJC(#O:5h( RJ̮Q 63AB1<>r~*8WtMB5 4-؁NsE1#P$ėZ .x789?܌m8i;A'RL!F]RpxUUqCh?[xM${P~~0 Oޥ!ډ~1I/?;SKA-@ Gc@4V3ϓ\$dpރKYՠҕ$*zzUm4}?m$f*p ♣~M@ߵ72:zXў݃k=L,6 {g^IF[¡~ hl[m5Rzred@(bؠ-gWR%`843I+1pʠN!{`wQpۤ,0fuH}ʞcUyLSc%x46̷juom:9-哦 O9N'q@lr pi($!wtWG/O4D3%}P3IpۑBA I>(k/$Dr>(겴B2YcVCbA?&?H ւ]Bam(mԅT $xeR |bݺpゾ)e3v'M-&ڀDq@J1Ev|6JA/TVS3z 9F%|QVGp"\F?Ddv iH!@=sV5\ F;JVX?|> Ym 0dPNy5 yDqUT@ T}<3cqʁ,87v_)+4gh㖤kgw"a )g Tx$o`$],b8˸Pyglܡ %[{Ӂ[Q⬆O`xfꇽUV4@{e_y&X^Pt ءgcC7vJ\98Z2Dq߳4ZMw .vtrk.㸙.Z5`N'(>olO @]H|,dC⸚$i}O#XYZ*z"J  j0M 3v;ts(,\[*Dr|ѥ%m r~*տD0ga#\H7|fJ^*e?VP\G /D˶o "g-]wjK9sAjxr{]A@O85u՞eYw4YNp$Q###L$pH_\6ń~ƒ.MhB=zEcncQbGH*OE'Z%Y"0]A@R"| $RrnȠS*[ƹ~v bEq!'bSȭ`n'PcMcwsb!,dMv }nɃGv;xR=&!꜀ǚq ΰ!'։nalGxQmpN{sAKZ#s/HpO()\q?P@2M,3QcǓAT1TTk%e9=u"xO#0-A@E~/O8N@+~.02pdM׷i SP,' s"ۧ2%4 u94L0ēZGrfSq*oE^$b`$9d!Fi\|j9eP4铍⊍͏L1 L0 e44-܊ #p{Yf2N6xPhPf~n=RkwP6v T[)^Cu *ij  0E6!V$ F[JYG đ,1)Uq޽m21#Z,}}}s?9' R8-A_Jݘ4n?M.ṉF媧X'9l$!@1ۊ.)vK| zYXqWj `ǹJ|VaIW1?H ؀np^pc.Ҁ@Lyoc&6H-8*ӎ)Vwt(ϸpsZ zCx\s(fNN1EӳvЈW% " 'yc\&9jϢ';5Ʃ>]-3|WVzdOy#0`~EGP v$xkKOXOV]KP}Nvұ@x уqPclۤ樓IӚo尸$]*ww<ѯŲ,3O})wCj ^Qw{Y5ŏGC<6MPudDK#Hl|3[]t+Ǟ+V2`&$b$xg=)w ĉs^%xف$ރǁn1?zm)nI^2H2F! 4Dio,? ڬ<qTʩX|h,M, Qc?_³,pHkm7JrvAfk 0 bT5Ƥj'i[ÑA/][M|G[uX2hY igP;b-f9!(;X.jkhZ19QZY@)%j f$l8'qF8e 3ޥyȯjPq(kWA jT (-R5*T*T*T$90|Q](@XZ|bTK*+!8(ܩѲ(er1UpC*YX;qk$%=h/^SjN;4dE-qg37U"twfpݸxfo1#5l6g;0$Pie &iԦ][`zpFSkkeGK$怘f31.:q fc|.1e]' mGn:j7@L#yQwpA۴]AR=JFGv񐢃!%fi݉Qv# &9Cdn$Bވ7ж0O 'X R9'\\@;7Qw;|3T +T"̡Pr#40n㏵{afcܫށΚdJ E;`Fi}Ikm](ABpɡ7D5&URA^MrE|U'vM!ޜn chtiW3}5gX[I8/`H=øL9?zAGkg<3qIys;y4T=g.sg$591H+hֆQ$M->>"ʵfOH( 9[O1BdP]OhZz7]VT.Wq^zxƒJ_^\ȯ,pc<+ t]f=_INWǡXn4l@D4E- ȐpGN,poMom /0Gj v"G+Y,ٓrvxmuYvK\VKyRܘV`K;PazH\`f<&31^¾c*znuRTh0"RwV1eU8=C$!\I꬗U|zӰTwA%r Ünڌ{#l>EԄw # ͫ=jױZOcy<j nH9%ckH-ON_QzNV64SdrOztr$)߼n5U!n2\|v-$@SWF!T]F.WTxV`qTZZE  Fnv[UNNށvc()lj %Jddsj>&T$!"C YF;  0(3{6꺁2%cT_39A 1_Cp*m܊ vbmr- [.i#`zyijڝd `fb2~K_OlXWqI#?IdHs_Fx X)w)_<-ΪӏoO 3Я{s.$@-5ٜg"qꫦ}BNa~=}j%g+ڔ`|W+H4Lَ6,w $9Px;Y(K9&-[( O0fRXw"X7wglȭM >ӚI/LJBi"*ݩzI+&w%b \xCp3QCdk }WhJvVYԑae~C\|q[;6IWFq_/:S)}\_^]` Zjv ȹ5=v[. fu׬_'1G@g-.v2` |Hz:i:R8+]2lCga悻`e V$Ơ[Z+A^f9>*Fx;xBޞhڀM>80:VMX34͝Ì'Xd3΅FvC)t鱎H=_,pnk}s{*Ă(QDimYD|VO^y8K qR}`PbŸpHX)>O[ Rp0YٸVkI0<4~(FWaڂkgy'j#LOm㶵VL1c f! `7}f2,q*~4Ұi!@;SH =QꇍT.w!Ls{KYᣌ ~ɱͱr|bl;"h)ѽ==(1Ē<ָ&#!\PQ{pz2pB&׮((4.ԙ9})BďjۯF# 3AFa86jWOOZK$V5?ԩRTRTRMP1gAw 82S?_xR}V ,䟹4)dn !?c5ŨMJ5zհ= zXYb+jڣ94_G90#[FN"^OidL6E m2x'fX̉> )~*ֈ!XiXe}CIm,giii W J RJ RJ RJ RJ RJ Rx͂>ԮNyuR *PJ*P|VQf^sMh%}i%~kNt:0\+]*}FאLJ_QHq0{V9C݇6"g毛H=8FdD5 h2z[,{0JdngNOiTs.5 ~( HˆQW>hfک0I vLJ? ?恶5i86H k08YDȬjc;k8fԥ ^_0QH isXYTKwY@ro(4" 劏=`&T OlLp޹4IEQ#2{sU *7B2bޞ?=%4V%ahk:@O`|eBiQCV^KH>E>'oƒ "- GYP鶶+b2W\$ e5P]99&NJbȮ>)pc◘K1] S$8Pn+&DbNL[if;|pE- y$U3.^7)4GPՀǃTėwQ +jw?41ECH>U ~1 9f$e:ToL/@=Zƹ S( Nң!OM'Qoǜ!rFf=^eG]~H=c"&`\elh! T(3^_[{M5R:Y#އI>13UAeh #g}@*Hf;sY@##M}GJ:[]+ ;#L 0zIԩRTRTRN9k{-4`HN&^ O4{-"gp+u܍GM~ 0k>Ҧ`6} W&d >ClNo"Y[jںDr :}[d7Clȭa}^TB7PJ*PAJ(!K⺩Aʱ']yRTRTRTRW9jPxq^ԩA*TA*T;N;B@W=x40ݒ&b3ڭKh8[_\^@$+;L.8,SsRsW.q45īK&g֚Of[i-ޠ? 5F"^TQ@lǶ?b(PR*ɣ'$&`f84_\[Xʫ_Y23l8[HinQIa妕Genj ; cFHKUX]Nz.ȫ-4h%m[4-%;Yjܷwޞ5a0,r; 6Yas7![db+jΡ ]C@]\˫ #r(T%MK[(H\d悘&۹Sn4tU hFL.ӡkktNHl<ڬ"&e75RHVUPi/VXǕ<敽j &j&Nb@'~?OiyQ6)*+mT,FӐǵu-Vrx P Gn@s_>e #O)'-zɖD >xŢfe43#S1l,HE23w!OUG0Eg;EDéprPKI }6!R2[=Y^A%0!r~)pmU9#Wϵb5mH$@}FlB3`EYdԻQGyf,EZDqIs#,H5^)4R!٘?z:2v*7;x2m$;Pn5,Hz c9ipܐrx:|Zu`zU),USd=v Z,OST708?ھ*8`PzVoXGkjUG4m w2I*PVKu^jʕ(%J(%J(%fc2^x}DC*~kK^G,M4u~aiY^]g o\,.^#U9 M$dHăޝԩA*TA*TJ RJ S5*PJ* k׻Fs^xM{RRRRg4W9ߗU&fH6bɌ\ȥYDޮ5pTA,d$u>% 6oiuXp.m}Պw9+AKbcP{5_J1g֧GbR0;Nx ^DGWazntCr/+i^퐒?bu#{X] S;8OkH5XU*9Q{)+.2怈LV+,P$h0; $Ί}l YʃsR=+R84Ņ[ $ʥwNJs~i%ZrjoO I# ^8`s["|6 '& qI-?0=2֧okpl15 d4BU֙F}|V!x\;{h=P9>cd$ KR)vG(gpGMrL~o6ݢGTc-0x9N.hCO_q#vQi^ "U+p ^ z.,#op[YRuBpOz}r[R3ܾcEi| 4&4' }3yto'#TKroHrH=3V>[ [;bcd:vpu_cogt>k;k(CK'.FUp]|\f|֩E ,C1J&v=OB`zTLHwQPR@=Y1-֠a#0?%X=@J'QDIt.2?j8hهjDA CN%ST1?bƾ_-YNsܮ3PJ*PxAkuuR̜JJJxs\ԡfWIj Yr;0#2 GjCnc$5Pr+ȡSj=PL3 %tf-4TRTRTRTRTRTRTRRRR Node-path: trunk/prototype/data/images/montain2_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1650 Text-content-md5: dfd754ad98b20598b917f45d66d528b1 Content-length: 1660 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ïbKGDH oFFsuG pHYs  ~tIME 9'IDATxa@ P_)X2 Hbg'}7eD QO& g4EF Q_ ieD a?ޒ1@ޛR2@3?3td~FaG3K0@ C~;ӽBK=ӭ|Zs)/(yYG81uU>S_o/cTK+R9H&~JVrRxSeM/U]U&9R\_eM/U]HH{JH{IP{IP{IP<)͗1a۟g<ߧ9.>iC;.bvg{TaLz9Lڜm3>ә"zfRosJNnf>mN){)eo;NVy}-,ΆO:GH:H:H:U 6$jt)$/"IENDB` Node-path: trunk/prototype/data/images/mountain.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 48543 Text-content-md5: c962129d7feb2d00ba192f299f5c66de Content-length: 48553 PROPS-END JFIFHHCreated with The GIMPC   '!%"."%()+,+ /3/*2'*+*C  ***************************************************"@!1A"Qa#2BqR$b3Cr4%Ss ?K,&s veIV2۩\ QSKnqIqG!ǰr% {#S<5=%}`@_#QĥxۜXYn*8z;3$!@ͭ[@pR"!TwSB7kz,PƬ*[PT'kV yhb p$AjCe^LE>26 g&D2Xpi3oaB<i/qA2i6'ә Sh5p<G&J4H]O%l1]-=c *6<G]ub85Ι/ RWrK`~\;ڤH:C@}\0EImb(, psJut*9SE-7/YJaK $yc(!Db i;. b1ih$S$r)Cct@;;BCgvN8CiӐE&YXK.ԅh5N4 q[ cӓIdPfPG|kD6Gd` Cqy( <5G_i\i]yYӀ鸁> iOQsj~y$@ qJid"4;A"N)ޗK<1|P=. B#m/eClsoP[M[N2>(+#O~(ag Dx10hQbבz[JZoL[Wc`TQyAAl~2a0V@~Ţb()Z.[4) (-oA A5R07@ߤ{ 2ٌg4[TH@K<jN"@..^)B_o%;JsJ.Ff`w/ i:t0M4OGTil⑗y9?Syc, }مYV X x9g,-nk}ʫ8*i8R\'\+I7 @lD:5Er:d}wZS];mF? J$)cU4he·9"/@󶃽CeZ?khò5Q{Rv()n^BPAm`0r@.uwcՊ\K`Nr@wl{bgTd鵭M9 Twpw‘h*WW66Nqԑs&#ӽVKdH$ &1 Y;g@lڂd~Ԩk<R Lɐrph9 "q}hZrN#tnN%D#'4O 0sit On:4jBa J{amihxlA"2`gg,G(=vVtIeYj8;9j\W?~8B[&x휊3Ě|ԶVgg*(SzGm|Vt]n)~h-Z!Fkv!G%XG|*es sXUsyV+l"]maQTg& /O_O) 㓚&]g+1A=h ,$RGl^׶т8?C6n|boQ Yn>(TXQ%ksg4KMF;Qiv!R_qށ`dyG$i2;w#)HnR=ފh>I)#ɐ$UJP6NwL=G]O:ڢ'3UWZӚbAkU6̬{uG[S\#i;sAdb i.4S4"#& | ø|m[w wzhK#(Ei9?b+s*9$VL 4zZ8b>1Ng)!bRp#-ֵ3 Ą$r⃙5kGe`;пW%;y6,1~h|$Ǽ~)Q=IEUV~RcllL5'V3#E b>*%0`sGqԈorrh;2P WI* p|SB$hTK{* !ch43,D~%\N=|˨Lfh 9³\^n_̲9q? $|7wVWjƩ滽ԭѢn .̅+( er;Ux5;nc'-,M&?4G4c5Ƴi7.('ԭG).hW+o;1r>h8Q4hСo ^D@#hO+ҁ#C⌸zk47FqWki6–'oU=UV\pMW4Y--V]qh,q $y\!RP1-RxۚQ&|t4{{縅xHGYn閌ۚ ێiͼX[ zwgP*R""L  i0^mĠ iֳHpX M(wUMZ'c3 Pnȫ΂K|fdeI$Q =+f 渒^2d;xܰ^; [8R!Mu(EvԕpSIhA lx+;>ҤY}4H,E$s&0q(DH,kq@y.Rݫ.\MEm#=Ҭc!W1RBOj|y yBSm*@l*Q2ܽC2`41.핃'sLcر_ U^X`kKm8zpZ<7WeB r1zkQf°.{HѬf^m堅%TEl Tɟ Qi蠃nGޅIU99ygs`yȧV$Io!FNHl.m~jçah'+=q#9Ev^% !R,"NM*SHwc@i zҽD7D(RXpj5 mwݩFcݙ`,2A8EDCK$3G8h#Z1xc⮦}:e23^|eH6B8Vv>hA;p@ϿhOLKE("fb;] 0 cm|PD&yQJwVeWDЀ@;wi`ц<幨o`Zv|sA]A.fy\#2v7K<*Z=/Y-s&;\d}f[ ,g5~[jF1WzM`H@PFiю r%RU.+j6'Pj"'r6+qi͇a=9Çi=ZX0enA^% A3ρlƜKln `e1Q%u3Ƿ~]2st9&yOK;m⃣ԕG$>(\V6-yod$Fp Gtޭ%l2(-s<8Q2i+\V{=FB ܎TA>֛LĀqOKQ{eM qF6>~?46 榷X "AXc{x-,UIMth45%.':}XXoP?YZ>h7Y\X Ke-PYByaS85ַ}ykG5\Xv2('d}?C7Mzh:fE< (X{iC49[yd2Ƹ9º y wl6d``sq=' !oW2"Np kDkЃ B6[g()ᷜ@ :M*PaLV+x.eݴw~2d |ObmQarG`Tv,tf$Tt0*P$׬Ȉ@!ɪ5C9+⯾h4dTym13怨TGZ 5sh8$TC n88YV ?E;flzccxb"#v+)b8▾cqbcXXfpƀϳ˕NKRmCS6YF/0Kot$~)} n%hpC RHK'⫗wVӄIXQhdmRɥ~mb"?k4t(>(mGk=CM*Ю'uUGY$M_hcOW[{Wz:@i2N@hnj`ޘ[KB8ݱC b겁wlbEdc(&cN hUۚl;%#42F1 ' >}suV$y&H;GS~t#dpӊ9,'n{1IQpvoO[ 62x,cuH0C6AQ:%,I PŨ2"ǶHb }<@bV@xۋ+NȬ;Q됤!bˆ8 I[4 qA,cAFsH/nw(T5cR3EW.R 1AEu`zyUcQ U#[. Ĝ hZDLr hYA7 K;pGϮ2Y"A!F;WVhTxAudj3-!-V asHg#@ꠂ@]Co\ MYcL^YG yI-$|0bNa25`$R}mc@;bԧᘮ۞dXxwAc#@Bڵ!fPPOO*]@7mĻ"^<{jtb`P4NO+W)ާd~Z䔞@lW ٽ3A2Y]"ۖ1bOk}&[F󚁧 c'⧃O"nIlFvQ(*隄6ey[>H/~?jlev>2Q3 / krj9>ix7RIWr͹hi#pLk~(QO6IY';k]CF6l:==lW6De榰RFT[۪[ZМ` D$|؂RKv4JYKA~)m39_† Xi]4s,'@b?s@KdePʓBP;1 _ &9.!h$3$dgN,-V4FV;VDT$~j%@<jaF""nbr PSOmmh_NE;)W7omϴOjk2wgxc_}xJ4b(ISg Hi" \A~&VROb(Kݣݜ/$Om=XuPkWvLcIz2_3&0YtT+P۳׋3k3V=Zl-ѹ ?Ymgl$4MŴӆ8zPZyFE[eT l|-TQ u'F808$4#4CwrP WW6eh 80dH>c 88]O6"{w2|PWܢy]_} N!ToRkc`\孼~wPȞ;DWA뫟Q+*=~AbMp{(ڽ:NccY繊۹jY .e)-.Jm=?02;evgQm;xe)UuLە@P(,8w{渎Kdu!T<^nn#[$ 71P7 M-F^ZOz;x 5%䱙pOj֏ܗ6Xm}р:׷i=FN<[up]ƶgHn[\s|=Jz&ز'[b`Fp#${Aaز(w&h7lU2; eM "mBJBd戶ўꛖ ; ̫b8С5[Աfp8 QfbjkI#ƠDHF2FHIđZȽ9w`+X\e|,P;C Fh7@].GakfkDeRR q v%7EQ)ڃGܶr]Ky]+̃a̬[Rw4]첔4[v2i (6+ kJ?ƽOsbZRHcHln>g;k *L;FT-镘;oT͒L޷.couNk`(ä{ڍM61O5I۝#mA0<%EP^Etl󊞃8溬8ֱh7YZneJYyy?K?b*[` 72ё SʂNZeQ1@m5b- ٷ⃹^mR2p|Tonv9&߉!A g9#iM,l#/$UKNDf(^ޫdlgO/U]zKӢK,W\}3b49MʅH=7}T+?3X.Ft 9 -̧~+BqP]1r2dw*{[u5Hl"ks.qx?QZ6&3{恾JR8ikJZAP9YSNxʪKE9_v@9$CYU~LѺJ`l4 =nPyPTQ{(v [R@<|]TP`fȎ;dw,pǂ11mf AI=5յEЀKM~c owoo cq$dUY&1E5/^V&%z SGڇ%$dӛp6(P  =ҿ?kT]J+Q[ o~VVVM+; h7YY \)_p^"YD%qGj;V`r YeZqMuPls[n"YYyꤳ3 $m; K{Whʴ~A5>)ޓg~@a`|H-, 0 x@PH]ȄόTҹW9WK f}U9;4W$;x䑈̸RZDD7gr+vN3o WX^E霒8{Dx{V|5v,ks32zNj-"Le3hj(wJՠM0)#p6?lܪx6nwIscHk@($MILA2/ F=+V=RS:ƉY.c^aFA#` 0MP|^1F "tcZ‚eJz+p"Hz ֨u{J8%Øb䟊$]F{s]G*.r|sCBs@KQJfD]2!U+h.b3J AOW>82:onQ]Ru $v~U#Pi #g}I]zAl?bƫ[dc9l}>B{1MI܉-h@ibX7l4岞*wo4HghTyn WRU" =gA4I- c/n[lXRxvtw{K{`HIV;_M4kMX/RՍ̟̓|PZ g Iߟ4=,qr{W-ks}8{X9{PX50v(X2UI<i`(/=Ȥ!$$g:Be"427C6-ԶRXR]P yc,G-|Rt嶷M{)8ǚbin&#j(H7O}=lGVZZׯGjuonA*'rKeg m1Lib#ؘA#~6]cvViPhH$PL,XXNK@gOD/s@&U*ydvZ] !lcA4om[ճq][tMzX9 kpeF fBKpZt-2a_4K'n  Ij=$~^\xWN1\GL%aCI$2ۢ@?sMkbp< DQZh7*sWk;Pf99K%u.}m&׮ak;ӲH(dhiZ*r%M.x#X-Z8$ p3 _x7~VR[<$-o^J~0@L^1]I}Hp1Pbڬ" ^4AԄ{U'LRUpTPat  ?5nsшx.+kiե(RTW.t=AqA]#!\kRە@I O}49ɡ#W2 8jmYIs,w+攝:Uf+LJO4-H:*;P^rxTwREô]q)Ε/Oe*Xv?Pܼ+[nP|e噳-U;T[Ju7ϊOr/S2H0N?4 !_ Tv9DIl?4浌(7[qXWfeh`9p1\f`P(-*K? #|(\Kޠ6j[yT(&x#cC ~$z0M'4;{"ΑƫڂKȭ(-)*2;qJlQ#kEujNXuTm Yco GrsJnPy`~ՂelqS0tr}X!6;ՖSEv8iܾIjb` {ѳE .?n~]'UgރuQ)ŕͼv#9Ӫ0)ܩ3 ԎTFO\!$ph"++&-ER[&"w0 ؠYv$I) 6.ܩS*n-e1[y7@㚎b̅G~hB &qy"H' tnWK qM!o4 Ie݉hFǑV]VAkk 0ਪ-%mIufWmq#ҭ7860snnn(] ޜ 6`cVGt$ ek<q`SŸ 4F3o>iB@_OA_L 'x0=<"M^+f>sNa` y3jdPE(r.6)XY38ipЯd7lbiJe,E H-.!X˅l柬wmb;dmtK$&<\B$AyjKYE9W4[q2{"1e :458cUc1HT``P*}+h.4b((+[5e(_ۊ"4p0MVn4x7$F`ILryT/V]Pso5cڃyok?jVVVPxdI2&l4D`o` zVto1[+F˵0 DE1M!iKm*.y$L+}ۈp$ 4#]V5 mC,r>\VѶDArOԖ= 0mWsxs Na$gsSB%vg+CmXu>+4JAsqc$U>rkƝ c308oUi> ձlng2-s+[ %5\^+ 3}s&pNH&8.Y/fk}v;Ufј w$bOVb1K%1{:4Bۈžsa6˰vJ{X[A!+.7Rzv QOPבAqZ4yf3'&&aǴ}"7b2>MK\d`8= [Y$b$F)1vhSskڸ8M.+}>I2+拱=/% IX*‎ nh=Ss +gS6!W>F-.d *$71@>HR(ح٩(vql!vs v윜0$@+1T"<1 W,m]ď"N!dHt{5=n0<ɾdyijE1⺑>i Ʒ%*5d2\YD r}ܱQO)'l!HH-XEoO>h:5%s0Y̱ 5\c]-`?MCIxn+rFJ'bk\[$+AUA^媳鋋[ֹ \s5e`Jp>E%k"2I&S@ н}c".#V`x?5G/{zf>hksZ zakmEyuoA/VB8?&}KS3@^F̥eoEfpFk7qA9u W954WLcW` *fM݅l$f\ $6Vobh[)iXHsqqTAԁm$3TvႰuj\Ri'RdSx#Xp tv6'rPt.!F/`wS7@}:E)}=;ܤl"(VP1ZܵV=ο| 9: h84xn*OOJi6"ı{`W[^ =<:)jWclѱjKrgޔzMF!Hǹd#wgPsqu%؈lq}Ao6Bx+fnYtHcYLn5;8b6@UTB*o tDm9dVW)w$&&=FVN8zkOpIHYF< #KJ|]=2}*:Z&q^i[泰8v 3g7mnJtĊм(8o*Tmz$@3PmÐ1*3r5ld+g0Nk5K+%?5ʚabrP~zv[u;$R{3;z+m$c4]=D',h=:v@` *0!9WɩÕh yӟ'=(rNy;+iyxqsS4JP*mA,g*)4LZ4|⌊J-9+63oaqOnmQd)joOaʑ(.(cq 릹RŻgi1D:ۀXR38Nۦw+H6e?B0*"I=*}teQmԋ%-sA+y/I$ʩ?#=yR9b/"Pzaeؐ8[nƻsR 7K䃑.e sށ\oP2>2pkn@޳LwhLJ@"hrhaSdo)am$vt̠sWyZ;E74I3jk?XG+w:]fV!ԫek{3h b"UU +Cp@~

aPbJ <ܬghEIce=E2 X0rr(8gߟ"p@}b;**zi@G &د\F馧H(ǚQIjg p1_Ť/2;[k<@=[ڱ0En$ NI< qg qnDH\8X('^Yta&ݜ֭8b@ǚstJ&x5b3S8KXf=dgr='cڭGi%P/ivhr!W/[ (4Mz҄0ClB\\E,c"^ ɥ\IpzABXr3Ps&$v%Xr[~;*l5Ȍn`Ƞv0AMpu[_bvn,THReC - 3Fߘ0M!MJcxtZ ۏhtW $$x(,O4 (vfML%EU5{ˋ:0)} FKv6@1#'$:G- 2's>k%hʝ e-:uTÈ栆ܽfp@c@f@@+WiTF*aor2;q Pޭ֐+@j滹EBCi2{`Ciae4 D#2qD3e I$7uNJ`#Ī8^NGez^`}>T: ̋ըmeYPqwq,gr,{r>A<$aC'M4W,B>8Z {q@OU&(۪w4 neUF d)Ɲein0<*1~S.G;W-QG!ߌ;d =B-GQXq(}]@E0*9<@K˟gŻ|wlsA<0\GOťG)hOlh%0UK[K)!¹UdRrkW֚8x@ m y5&26E P0=V[oFԅyVl(ar0vxCLp{ƙ%t $7=4j6^(•|QV<9恬X'qRTsI Ewn&^;HޫvjbHqU狀IU ^mfw t.O"!ZÃqNңrf0py5* D5B~(&aH_jTYdW4Ԅ4 㸠Mkm{>f{U{TvDI{ۙYvN&U%`@GEd"H&Ӑ1E(;OՐFCP6-Ϻ1樗^j:]I.b3HH ;b-6,,z'8 @Kby>+SN"HfTBހcmFwϏ5n]F81,'~89ƍH[i?d(M8%UED5}Y7U0hd'XMr*٦,yVQw7K1*08z7IlҮ 1ޚ]\nimK $*q}|./1@s>;RMŚEU9j4D4G.V3Z`;[D28.õRQ;ov>j-g-܂{ o;wN,R)#{죊i{(*|,D%Hh-)sѳVȷJ-;HU [[uDkl)C-?NYdA8lRi1H$gGPUW=GFKPHXg8o='ɨNqEIHU*>y}mzk#=6P^qoߓ^v8CAǥcQ٪;gEVqAZ^kN+TS5Ip_;pp~(&xsܪEso*Lkd~WRuJBK5[s(Y.ǏJtΣ"JszT`K|sAyV3.I((/gk 1Q’JLQOyC37e0!nl%$.''WMs"_Z߬5#+-4N8;F-{X n>23+W#⺃@zud]RϜc1l[A>ht ëkX)R/x!*:D:%eg8u<`mP@Dt- G5wUCdCOkkA@"z͂˜K6Cois;s!{2,-9{n<5隰-b<pXjiɠVP80(b˩BW#߽3kUnj5fԉNl{;U[GڹyބFNOk(AY|6IWn#sAW6pp6wMhun j[ cigcu>3ځo&vF\aJ#K)U g4{cԟ;"v0dYf`Ek8 @c%$yF1AxX(Cpď_V̭ 3IOxYXMگWX?Q5ۡ{x?OhRu,IsچČ?$m1 qǻmEFxjq Vc(aa(0 1fS1%w" ]`5Fk֯'Ck(^)8=&wcX4m6F7|>{}|P2i҂?7E 1* hy2;I$)8'5bB@Sn{T1;dW(]RrJԜs抸B;(jpBVMĜHާm!+qwtС (1/Ą_wa1% 7-,2#Ft4۔0gP[q=s:+ށ)y+Ϛ nǝ^31H4+.mո!#SV%I>ć݆PfhN~]g;7w圈/3^Hm |',zkC}lHx4@ǴdCTb&ODPcIA@ 9<(,xiːiۈ$㚤\#YK6[ՇJ(#XvY}ԮHU02hw0'PT}geѤ ,7UK?AzϪH6bil=ݥJEpA&ڈHQ/`y5nKf?3|P,j<PIK5z1#k!tn] |Ole]&[3יjԞga$P`Go#^-\;Q5lz=Y%n0zJL͂RctTa@q qrIe3CGSk\(N Ai s5 s8{[ci*&6`2ph+w-6hڎ-bC/.GQ8ҬCBG ǚ:v^تoTjȪ qUQe@$xC+0=Wz/L[o M;c7?3%͡leڃҰ+ku17Y>*Z̊4'qE'CP$fhhBI;zXw4U\A~h d4-A*e<+}9] <o}Yk auWѓj=FPuZ!yrE'C# {Mn 3ShpW?fM`m#iPAWƍ9bvHeΙx6*p*&FP :G,TW%2GsOZڶ|blD6 g\u<" M4m+iߥ_rۤۤ.q#8[Qbq6C:mBi (=eīmbvE&okxFm!-!VK^YOz沖PSKUx6#,{Ȣt⎷uҔ[Fl9~~- e#Xv=kpC'dsR[,x@QVVȽmS8$*E2dIa@,b8[ǃLɍ|tCo+ W' ./h`#ݑN=h-M[PԦ&p[|S^ʁwy4=]'p2jsp^2Ƞ fpq\!>jhXQRP_^6mV X}Jȭm@;2{\5TTw q\nK`[Hd+UĎA Kۻc ERD@ 4}: D(YE%g-ۊLXdHۘs9 h>@_B?NS^\feTcՏ OG4^ :CVCهz .0񺼄7 BwMY}/kOzE)Do'4EU7N#iJ,o"zAN|n.~s]բp(#!x6D⵶ /pІMp֊z+3+J6}žh7YYYAdsBn*GMPm@͒[ 5toaڵAWLAȾ!⦎TeEF"8]=ڃ;Xmi1xVx5;mgQ,n B lN)Z6 ̑‚4ar]7uqXyv0<ҙa=Ai]BKw$f. *]eb*M7O)G- hiޕm(XFveLOi坉0[t!rM"`" I8>E\JPkʠ((RzJ+i.t (K;US"A\0P>((cnIqQT#-+Ķ@B7mK*(TlQ&P,QHȧF]>->-hdEΪIV]V19aMc\ܪ9(-}c3ױ.+;ks))J0n<Lbͽi:\RdZ/ Ns44֮X̧'FipDZA5@>w4qx6W*9R}7Q^'kؔ-(`jMRII=?1%;1sbM ?Ͷ 98X{TV |q]Il~½9r;p %;w&4@݅2K2gHCj*։#%n}s[@<:MM&!wP8"zcbX,>T^ԴZ=AIlrh4vd'9psViGV $ji"xp8%bafF{族TaVVcGa]Cb;/$ʽ3v4&<٘iYp P6x I-4*2\/=Bƾ@OO:R[i(9CoIJ2sd|Ղ~vgck;Ds4Ր" W3\bOy7uY>hIcHiXL ,gznF<]acnzKXޗ2qJ/a=6Sq^{cRr)F++ɷd~(\F$$q42:czِ˨ɐxQ.4L,MSHxѷHɁک\M$̋0JW"ps@*\j bMuC+TŽhm!4 01Aj6V1'YEZt{UIH>h5hJ[`VtEkdgH֖xaAt[[=FCiܜW30W9а(Ҩ,=ik\ F?5fKj)=WnGM;qkX<h:Bʑ5VPej(+f QmمHav@(0º.3NJġ}Pt+E a& fee`VYAPzNgQ01R_tTqMX']!(KN 90 z6 bFiOQW3~{PV0... #ֲ3`1NU,1A )s3k"{API)!h)9DLߔgMU9OlЫ &ie$ 2xY_\oq8mJ`NNdsUFݕ'ܗ(` ck H=Gs ~)qa,񐯒~(K@sPl]=HٸN\*1f"p#'-bEuE-0)Kc>i})ʭ Ai\=F9UXP '?MVca#EE.օ¡V-Gڀ;%b # -W7E8Yꔎ~%q(º]129yI<`nYc!q gu|RS"5h݀^i6. LsV'%L"$ [HUF,EZ,lI^T{)p|+dxAPX쭚GwM!)H\EŨ^8w.7eGeF։E8AJ2mH >OSX)^pEVefM mZ(9J)=;2@5qB4($ 5;iC:V>jrQ"= ,$vSFc<+곷p*0ߖ'"wHXf@$Q-.K&<~hK+ QYX#5lEKgl&r≴{JkSurgv39]6OXڣ2E`Է7Gg]fV0.gfIǴ:{  SߊwHєkƴ[{y2;5q}/coj>ږ(3,1@㊽}3Kjv,()VޔGI09\S%dq|Ձeq/pGzs$-UhXn B5`|bOso;% z23,)P3:90<ϩlApvri^qtF4ӽk r4w7reR*[xt699ltPdqT[MeC?:`]6PuT5zxjA]4i,ՊQpXۏ\K4p!yX*&N*|lGJ6)&Kni|KFv˭LBdcO zZgDkMefJR =0ZHWj F03̢՟-NK{pQغ",n_j5.pE4Ԟ6tV?T ;ml4Gc+,=RGO"kvEۇ"UMڀ]˙'hO.cfU85(`ӱa!W}m\N ўh,WPRlT['i>-1uX)2 gP5%%@GGI{m fd}TTapذE1f; PqF3ln.;总e˱Tv6(K Ӆٓ@6ls[g2#!m]傚jVV$1k#rI$Hne܈vΏ;[5a@>p$(\z}L6i&FSޯ&;g=ŵ㹠PrVxy>Kf\ SF(Ɣ纔n[EWS9"#ibQ$B^jV}yQBۆjյ&"-]cնzc4Avמ:YeSl?,t@,3t R9aF[z^F vV[Hr+auFUO&-*  HGP aE[Ò+91AԲAҽSKZIғeMw%.fpsui(ށ ri^e՟Gm Ǎ X&Β/WL!Lm*Ih=<FA0ҽmwнv=]SX!on9ehFAn++XN%Cj5תd.i 4QiuVl~l ]ƭknt ~IU(Ȋ|L,v#/!MG^PRjƠ$Rzz{3c',մ(hv8GG2rBO,: d6hVcמO<]s#V1˻w1UЂ%TrkEMԀxn-gS]KN;PXY/~]zeq`Z`\V}Z򰑀+I[Eiצ;4m7C\jNg}qLu{K U ڙJ`$Weh}e`|Җzh=5t]<*&3΋֐  PRCh2$G<&dVln>u e>I-UCEYIi:+/ާAbT@|AJԺT{S7UP Wh'n'׫Y$1)8h/zR  y5y e'r]m#ڴ׭*lŸ`cy}8H0IMɂWp0a"Lcu u!i$YFߙ MP8c⪺ !SW"$ҖfûvYڠL^) | ,G@c~(Vv:is~Da?ODxZKؠp>k'5o ~i_P'xy@yI4֟z*c+"_TzVe Ĭx3EF[F(@k P#|1u|be,7*w CX('{Op=Ts\]:y\TckLg!;KX!pj4Ѣ&*|KurG0Z(fk^boNTmGԲ]IT"Id$4UfrnhRrxv669'3d9r ӿ‰MT J@lMRTHk%d:jQb1p~N8YZQ@V>yOJj׳7Og٪eNjg< %\s79j ⭅BM3'I@][}>-̻܃UCWӂd=vܭ%Oޒ_ut 8h+ΥL2;V$ӧ4Ri|6Y_-ۇR9ɠfu)~ޛAg$`8T)ugò&&ߧu4Jws(15Hm?a1zAYꨜ1;)ߦzZEY р^ZVő8朝m]HrzA֖FG$ISN(XsWzSs=9;zU&X-wF^95ɒйO܈O}01@O$xUuD_0mMIp!%=1@Y$#͔Uw1Pu K3=yV=vv|i1m/%}E/xOx'&~v fsw֛c5Ol$WZx5cxm巕w_6դro`4bV̎xQ&)2ͻ/Oi,R:Wj6HcIT֡#n>wUJ{Um^2")N2,dE 9bh b-{x6sBh Hϟ'29ns=x?z9#8>qA]K-aƑ{.PrqXn&LJ}Iu2"E 11₹6Չo$Mo!v`]VxlRw4V${I)427ɧr(w#@AkhP|Tf;IB겞6(7̜L!d%2G(yDvWKqH1"q'"`qZw~D8#Wes#d'ێU|}]K&VUH-?KN%9ơl4 ^&sVe(;9&u@ɭěv-u45{ 4XCcG42H{M&7WG1@ZzNIS^ 1P*1T vѷR$?ڭVœB@DpMD3IYA&su 5Wnw&\h?Y(1i(_L|3[V-5jK'1*oA `|Vmap?tuFT9YTK P@#`@UW0:ww[iCڻ++\b~X!h\$cD,=r(=Bkۀj Wh # Uyf #h}ؼe g&^Ap%  'NVFlRD ^M+VKPKa?W4&WOQ<.lޮD81&#X{w!Kukq⧳BvHKa!u" *e:`9$74zrncB?7[jq[{g}ʹd=pǨWOU8z!hYp1!ZLw #ؖeZinˤ^=#PAcpb0cVyuX;y|Oar 0c݇4YnjTV2,X~^<զm%(鍤@,pU 'AM! O)ZCf7Zr:*rx4(+ qUAӼAP9BO1g)|L,, S? ݳ"pGaT?I茺ܮ(xj-X s@U4$+ap<{c_h4LzN&FfskF YO\ߦtᲖfXG իXO4"tWvH &‘^zQem;c}4BAZnh׼ڕ̞8$3  bJۑ@"U3#N+A1ƑĹP8W[G#1B}TR3UXzʛXsI5MT&V"]-plG$T9$#Wim)]r92Tnl/g Y A!jI6)Xashp(t" HGȠ1u (IX#YObO\-[*>Rm LcKK3MY>is4eQq V)K"7A_ r번TbT"$)p䘢r5 u<0)$j׺l-U"ώ Q]k}Ud!yP]tK#dQWp:rN ^E"%XDD3(?A g6kW&`|VӖ(u*O@y1YW$j+7KYJ좣pw >vd,Bˌa]E8>ۇ(q Q[=8Y¼eM yc Vf3R PK AxQ(&]r Qldb܇ E\:W$$p/K6rĒM_d2'Xd bdU˝Il5۪z2V1ӷYkYe!Mp1( &=0j.hb}6`߀#l7Ļ+vfi/(x.4๓x5 ڭ6FW-KF8ǻ+' MFy,fc)6Qweb~ ƅM\%x BO'(6UVpL;RYl6!qDjsg1~Ơԡ2 hxv{`rΪ0STF{r˞*g^^,l"-P0mB#2zSڍks=@Զr$``<g}Ƞ-nV2]G*D]';U-*,Ik jӚ]qCArۼV VGxP- kBNh#!Kc+EZZ )(pT8RvHmBfeU]u13\˦J5^`,Hے)b0U 5Z" $q(X94lmϚtPZ'@Yڃ2SC˘.a*vӥmU#!V gEv4{afylݽэ YYAYXN+j.SI\ݸdy=UK"bf縧VZKJ%U_@7Bp囱+DQhO< 4}if&E"#n#\nmo.!n2GQ!e[[89b(یj>خlr儛i;UU^)@KԴ: I0G-DuT/Eak0[{Fqw7e{Q$*\is6% ,r3+Z~ps*ŇedmC1 4Z w; :-X#oȪƁɊelTOjHO%iG>=ͻp%VEpqI.!Y1(4XjZvɫ05庼0A:?cN4VKmӁ _6}3.l#>4" Q}8Mw 62hYEvhDs񪪮^ª6z]nZ1LN0jMe<ɉ(&G,4jӸ R ")dn)fT${hX(A]kģ r1[sz̹=1N4:J]N'$#u zlKWD6>T1^EH.~)VQAԚm*ۓH@\\xsfiTemC@fQ Hch ҧX59#`B3`sޘR7hUFA.oE,a< f.m> Jpgi.`B휜i:k94I8fO~;=a-̀K'9YKHĪ:Dl[K^@-^&O9^ykwSd/9^.䷺]tp!Dp0ڸX +'&O$ 1@ɯuf{(Y1@OInUJ^Ѧ|GG( I9겹s[>h7YN3Zʟ4i X6ރA+kJ VVVPyݤP ~j4O3Nv*sޫ>e(".fKy3xH.P}knM.ݍkEӭxI? ՉR8) ΜZ,Jdemn7wn`+ d-m&b3[4 }#0kW2 \܊GFTeqU`ucVAMB\[OdPW|YKu~qK "aj;^ Jn[smsmrsA_17ޱ$#%ˍlZ行~0hF2{@r-ܓ{q7dSEnѱ 0rq@{9gRA*rˊ[97G% 1;'h lbs@؈/$(ƌ m̰&8"ܱ3i=y-ٙ>r;[-IDڬ:D 2|5IcW1d.*ӦpȷK-AjO5xt,Ƒ-N>pXRPzNҒ. _rcKfF8@h1f4?lTIZMp]9_ipRAn:esAfӗ,1]4ok>bd@@~GjW>ui w ܑj t&mÎPtGA5/ۚLnBF|5yT1>ѵM*` i_U0+ 9E#ҵ"IrA]XIǐ(5''W*>;f|Tij:<۰6w)ol#gg;\=ɹ4KB(. dw+ށiQ7@Q`; [֍f;jSksRpyq^@"(┬R)F ,8qƲq;UM Us#"e8Y$  dzvYH|)Ak]ۃ-p'3f,uW6QZHzY>=*V5u ^->UFўqAߡFF`qQFDF$Fs+uع+[것(5}uYYAA-[ɠ 'e;-8An꺕0滓1/hJ6{w7yՎ+AޡԵ=!hrmcy"f$RH[(^"wxe^eZD抓P1'+A|_+9Wsp&3㚯em5[@ UkhKk6&@p{dG[K9`~h.uθ4Z@(HY*ɸAj{FQOjnk i7q80<}ŵݳu+r>6 e|P h-:,Ruh;林Vro!XsN^&'fxhM:#c.ۈ;|Ps0ʮJKp8Mkmg ͉]yMtٷc@镕U4>H'95=GEhu29A{tW"j{`ޝ=ٸx`PRuFx,f[iWr7 SJ\J Y jK[moPuj~dZf^Iz2+BkOkg}~zpJ@.;]@Ebuˁ( q#m,7 @JP"8j oh\>*Ʃ@YpXPWU 8Vײە)<mcbi"QH'zZw"V9lJimJ .q3._ Eq @%oԁ#{ dvWzQ j Csfʜ5^ӖH$yԺMmHB,GRmkvHbm ?'t+vei?r>()w,үPiܡW)֏wZ s-Wc#AH.[xv&v--#CH$ 7E:J)~|S.r@&ztQ̘os3M^sςzV+j6D-l;\&-/N P3P1YZ5Pnϓn++1YAPo""VmEfEs[ b+++(<myY€Oe4JVaqAݞ#nt8>N8j6Ԁ\Cx.(LZ Ηo4#8XN 'OH]bPIg$[1!;zIb0RT#V}y4*w/[Xn# A`"Tc\o}cwc-Uu;m*bG1pb vQZ|nj}>K61lAA$vV.}g2 m>%pbM =9}]O`(MR-רLmҏis LK-[Iٜl|ԗΨ(Qǣ\$l1P)oJcv\p33'|'WJnRh-(,_[nHjemcx 6;x :XooGAy*@P:pçbLkX%Amx/DzccH]ڡ6e7q⻾8#u,4 ZmB7x9E$gLdupG+ uM=F,V1ڍО).]?p<4=l\8o eđAxO4QE' 6-*(UeeVsYYAL.;WUYYYA4k[k'|PILJ p[nyeee Node-path: trunk/prototype/data/images/mountain_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1582 Text-content-md5: 5e6e9458b8d5104f18089be2227ba3d3 Content-length: 1592 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~2 rbKGDH oFFsuG pHYs  d_tIME 7Q IDATxq0DA>RQ"ç ?`S$P؆xYDD շws|xn$O]zAJԥ O$Ke*3eN}VUf|7|ޙce/힟cV a9fe/>tE萮 == KGtG#ѰptI4(=]%  KGtG!]QAz::+*HOGtE萮 =.PIz< ǣ.PEFϽ'nk{!ιά'̼6b|8:0ڈl[1;ݺ֥1tfKy;oȥ (UO H Q#JD -gTiHIENDB` Node-path: trunk/prototype/data/images/plant.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1955 Text-content-md5: 163b839be9e1f3aa0a08364f9ad86a76 Content-length: 1965 PROPS-END PNG  IHDR7xZ&gAMA abKGD pHYs  ~tIME Im IDATxo?o^ۻmFˏTe\R)6RRr)*9 \nPP!aRҪUk{ F;7.\1,F+|HZ뷍1oJ9πW* AnݺղN81 H)<u+'6puu ~_=77`kI$ Ƙ51)z}$2(wmVU|?t}QGCJJz͛WM6q aFQXCXHJ9 (PJ8RTUvOΞ=j@i yR*ZRVq]8ɲ V%IHk]xz"q}Rq0 I!Bׁj릧EjGw<0??AaHtuuj ,V~z .|zaV8?jQש녢} Ð(``` U919| J1{|3noY^l ГK,s?NLL4$bAJrLq1f?nzCTц's~zsnnA8㠵ed MA\[+w1,,,|>Kɶu(0l7lWJ!@}-E1(}OJMZkOoo/뎱[c[ 􏧿T*{RJcPJQ.jw0<9s&]ѣ;wߊ4M8} q^dfY,I q1dYܛW Jk@3s$q"eYRʺk{iJ)q]FAX=h~~Pj!EY1??MJ( !AjZ) C)JCJ;^;RRZ5F!y)Ƙ1)ez#k|Rqjеk:@gہR<r̚AK#Je"dxxֱ? N`Reh)JOVv3 !|.vMMMEQ :DQNMM,8Aϥll) !Mk]xq8uĒEEEQTZm<(c8y/ RWWSP\WEua^ bajF 144T8K:9ܻw!Eؘ݄кeIENDB` Node-path: trunk/prototype/data/images/plant2.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2132 Text-content-md5: 1bbb672b509af3ec9f37376e452359c2 Content-length: 2142 PROPS-END PNG  IHDRAdgAMA abKGD pHYs  ~tIME $/iIDATx;lo< vcD.P$lH jI:QD-Bʂ(耆JDi6-ERDiR7Yh [H1cc{ 앮9?޽{%@dYFbaaŋ-P%eYv)$I>qgI$ mcY7o>>46ib&qPJ)Z{DQo)a8ykyѣ.\ؚ h40 Co, C( RXEZ]~ӡ YQ,,qg >myrk˲0M,Iwʕ+L_gYF$RJy.b4$K`u,#2,ӇiwimKe-KV,ˈpH82.zZX xIxq1~ @f}$Iy~+.^dY333:7`P\˗ CeYRF2zAr֭K/666Nx┸FO)iqIEDQ- u"sM?4u  \$c ̀84 0 ɲLg,KZ[ 7<' C("cͬ1 k68c}  -vRJ>˲u/:$akkvM&I8+,sJB)bHt60̲, àj̙3/..?ׯlo $@R \րcS-ɍE*\uc4M `YCAPXT*:aM@ZLd'Vz Cn@Ss41Ft]?Jx/.WH٫TJQJNz}TWu}qj'u]jzZyxi6\ם, qK!=ϣ^n sss0/,,Rzzo,ˈXu*Lω'iFAfk5 V5]>|ٳgh4""4E)qc6aPerڵ3u <Ðvp8$IRaDQDQM\@?>YiYVk*g4@XܜQ')5?|7cvvVKGZlj ygzhT4;Hw!,d[Cq!iߍ &~ի?{ΝS&g"~1RPi <ۺ8a=cr(8BJ+42i|>D`2MF"K~l H@t؀===m dYݻǏf}Mu@ |x<ׯu@{g )%L;wh4H&}G0M0x803x #0d2tovv/R(<|T*zhPV/y4M4||> -sFΝ;m"_\\ @uH|&1 wJ _P(ĵk׈Dʾ˗/f]7 e7HYݿĉo] 4>~5Mnד@PBQ`4 =oll ߏřa jJ%ݻZNYܚaaeYf,ò,4M LHK)=z􈵵dS F)ڝNNBI ( mG+x<855؁֛7o( j*n^a> {[k:7 Xh4zeiiIa||/b666*v;ŝa6xB= ^1 v<vT*ǡP(T766*\.dRc~ہ,x^NrJL&C>R)sZ8C:fuuU*Rpd0^]JY4h\___/R x!ܰa*@oonn.80RV޽{~ƽ{ }\Y? !Ddu_?(m]N{IENDB` Node-path: trunk/prototype/data/images/retriever_coin.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 8745 Text-content-md5: 374c8aec389e0e8d61a7f0fc67fe6693 Content-length: 8755 PROPS-END PNG  IHDRPPgAMA abKGD pHYs  ~tIME 'c  IDATx|[oWWd"wu$+vvN`0PYd`{$I$ . . ,|n7rA$\^t~~.((Ze>wT#EQ41 `Y00O~<c40 @G"DQn  C~B!\.Z-Z-qDQ 4Q2{{{[D"YeY |~?|>|>dYV5ӧO|&$䳳]O`p3a~~~bb$I ݲ,$I$Ix<z=z=(UUvQTP.DfNaFvwwggg dYF8F(a0M0 aKQ (<_2# "2/,,imFiY)J`rn<Ncp>._v# " N&i@ /L˲r $j@M&?L&,YnPqh"$lv%`z# amm T Ϟ=a6&?3,Ç 0A1#z;F|/$T<x1rx#EG>kEA(4 ?t:H&f"nP!g$I C!14o?yfr0tx~] >c3=SlH+QqttChJ%\^^Nmt]qpkkkX[[㐂D$󜎅~{6(")$ nnx)2&O h~73Mٟg.!fopGGGlSRdYEI)1uhht`0@GE@D$xshLۆ!t]G]u}ȲX,T*~^g;p%V xxi" "Hu!G:\9(J?< mBEa_g&p͇!4McH$\99 Ȇv]zd2lDjtpzzV VM w0Y$U'{D&2,fffqvv3F#b1D"x<(hdKhHz.dž,Jfe| >?~)L!Vj4i;(pv1;;mlmmٳgxj{h4zҲP(N0 h\^^4MS:\"h4bC)C@ 5Mc -a\C"`Ǡ( z/I2DS`049, '''7  9h4W A I6UG @i\1!& ~?VWWP(d/_\.3ȵZ D4, 6677q}hj"Ń% #%4M4MJWh4~x|h=p0Qqzz q$I$I  DJJ:k"(z.NbbS4щT*!5k{b NȉR)cii +++0 F:(Ƀ>z>e$!޽{ph4W`]by@dYf'V+AO 7H fY|Ǹ{.};hbIX5X,wb~~QJ[saq8["RhzYmD1s!OIaJ2D^N<GgHꀡPh`F#G8@1`ccpۜHZ; qŤ 4I.//wߡlb}}Bf((,͔MQ @h4 ǃZ]T*LBjR۷oOu"d MH]9kWh4P(x0??d2@ *a%IXfF]Jsj6石L$ T{B'U*)Ø bqqpN$f2  aff >x ƓJJP$IVBRx=t:.{P)%h4888 i;( 666 >KYՔ^VTarpTr؛Js[FCX+)$ѺZif ǃ`vvp<^X44 z]I( EApmlmmr0 h)f8$4I0 ch6(JuCi6b:̂͡R5ҀT*l6%d2lNzAU֭[xVVV*q0??φH[Z.//mf$$IlD Q70"D Ae1ľHRPVšZ4 nz,sB0p >v4  huVUJODDXF7@ , ɠ ]1 z96qJ%~&Sx "M9`0p8lkRSEʈU.Fzdr;S75ivMdG.Zjtttt eYX BYeY^I$SFKPN,ZcR]mIhhNxH$4Q?-yRۃ^^%,?,w$:b[@̵I%8dB.RC@v`Rj q:t]6,zb/_~4^w^BTM+2^K^jy",XeD& +I2HdYF/\;ǸRv\VbC F8s3tё|>Z|/;H􏸢bSe"B҉/b5e?~kYtsH??;q5,R%'&0eY{W饝 q\Z/_q%6$IRX_YYN$s҂st::'U-}4m\.:be0fj4ihZh6L XYy<Σ[_Xo*GYQ;wd@Zd4of1kYbrn `X,^.{K_UUeR:MLL"|R|v<4M;nZв,u-yj$0wtZrX]]}Rt`_q~DxUDeB#8>>FP`'*r+6b1ܻwD{~~ZS\@ pmmÙo.C<eѤ89PVd{41^xW6E0D2﷥VD$Q*8ּ_|uY\SvoxpMqN6*H,@*I"x? `zZTU[Zn\FRM1x<V_YYVeԖhmn1fuWt:buARAٴ]4Et]7t[ eYTUiotwww1Hݹs'Cj<^"Fh@ (,KTq1%;”AqV vvvKJTWl4HRrD"Ҫ{FD,W^z^bii kSĀ~Z6 M%1cHP`Nv&Fz8??afs;R 8<e8d C<}<'|+enz<dY6֢h( i.T8uoNo)I&vwwRt:7QD@9s0́.$]1ٛ&Gx/9 ˺ݸfօB!躎/_rp( `{y1!N EEGr}qq4zsyyBldUU.VϧQl=^F'8dYH$PjV!FՓ'O077eayy]( ~_ uI+H,uvv/^. `uubF{{{`[\\D(*c!bEnK~ =tN0 PTئDQܾ}$p8d3$jC4luDgxy |Lk۷occc333urvnۙU[̹K܌b 766pqqVe-ш6ZUbaDQ|G^۳zX,_W\sVyD!1WZE*d2eh;pH'''RDZ4uĭ~2|wzt:h,L$H& iHzPU[[[X\\ӧOcj5looc{{GGG hۼ( z79Pݑ!4M 2!p8[n!g^'''o%AlllLO( rءx<,5^{UI e&.WrUUE:FZE>pk^[[h4(mZ\*킸-nZ;&}pH6. zυ U"`kk X麎K8"J1[n>C^p8d>].c:1m!G,{>vEP`zપbnn`R:thF&a>p8v|YBNDE䯈0@q"Acuulw&o,y޽{$ø`n(=$4cqq\L zBkq ҖeZmľ(PU^R&hh l:#EQH$lt2D"t(np;G 896ĝtP ߏYdč6b+TU۷Jp~~nnv`W)2*VWWmΆh x tiRI q'8@zy8C@E({;DD\.'@$TVULsss\N .'2\)]qrrΔ>|9h*|5'ǃYHiIr\FXk}> ;yj$M%X҃Eԧ >yva^l0Rik)"xiLRH`gg'''TΝ;XYYidͩR lBhhBV eq2z=`ц,knb6mH4PD"\.ꐳv<qMmZ-2Ft7Ht:ETj]^4MaR)&-i%]G8Y!A릕4$IeAGGGﵣGGGhZ4x#K_^1u^ǫWpxxCXĊӉbW,;_\7MϠbG}>W *ܹdIٔXwXxP@P`jYf,.$zd:99eW@WYJ"ߎg)/PrᏢ".F} ˲D""e"/^@Ti md Ucggvd˲@Ւ̻,$I1I$LXBT_ HO :#G@je:A]&oo*MM[naaabt``A?vN'''^SӴ|cYS1u(`0xtyyd2 ^>[jl;F$`IR-3/e,*=kNL*D)B.Ãpm~mƦMҳ-=Q|ZIDAT#7K˲/8X׆v4Y:LڗnD"T"u ܗ,J2II4 D+p*!RoIl Ř4cwwiYWi/M\-6ɤy𿛦YjKX"FqWSFZlrS*H۩DD+N jZoZy~phvLBڰE6eYLw:d5Ϊd2hR{g*!!p$ Vi!}@q&J+yY Ex;Z_;op`48vfW1zX|/ BWMCX|E9B*N)IENDB` Revision-number: 10 Prop-content-length: 149 Content-length: 149 K 7 svn:log V 47 Some more scenes and a new object type (empty) K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-30T13:11:57.000000Z PROPS-END Node-path: trunk/prototype/AUTHORS Node-kind: file Node-action: change Text-content-length: 28 Text-content-md5: fe55c8eb875bed62c6d3c242d9d73fd4 Content-length: 28 Ingo Ruhnke Node-path: trunk/prototype/AdventObj.cc Node-kind: file Node-action: change Text-content-length: 3569 Text-content-md5: 5374064910b2eb4b8d71f95feaf44649 Content-length: 3569 // $Id: AdventObj.cc,v 1.3 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Scenario.hh" #include "Advent.hh" #include "AdventObj.hh" SurfaceAdvObj::SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos) : AdventObj (s) { sur = arg_sur; pos = arg_pos; } void SurfaceAdvObj::draw_world () { sur.put_screen (pos.x, pos.y); } Mogli::Mogli () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; delta = 4.0; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Mogli::on_button_press)); } Mogli::~Mogli () { } void Mogli::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { counter = 0; } } bool Mogli::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Mogli::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Mogli::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } bool Mogli::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 3769 Text-content-md5: 23abb4e78bb1ba8fc82d5730416625ca Content-length: 3769 // $Id: AdventObjSmob.cc,v 1.4 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (SCM_CHARS (arg_name), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (SCM_CHARS(arg_name), CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1508 Text-content-md5: 1f5a13bfa5f33b39e721d930940c70ac Content-length: 1508 // $Id: AdventObjSmob.hh,v 1.3 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { AdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static SCM mark_obj (SCM smob); static scm_sizet free_obj (SCM smob); static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM makeobj_surface (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM makeobj_empty (SCM name, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM set_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 3757 Text-content-md5: e3fcca8b8463efcabc88bc9086f7025d Content-length: 3757 // $Id: Coin.cc,v 1.4 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; if (key.x > x_pos - sur.get_width ()/2 && key.x < x_pos + sur.get_width ()/2 && key.y > y_pos - sur.get_height ()/2 && key.y < y_pos + sur.get_height ()/2) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } } } } } /* EOF */ Node-path: trunk/prototype/Coin.hh Node-kind: file Node-action: change Text-content-length: 1378 Text-content-md5: 31dd43502a47c691c84e5991dcdb7f2b Content-length: 1378 // $Id: Coin.hh,v 1.3 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COIN_HH #define COIN_HH #include #include "Scenario.hh" class Coin { private: thSlot on_button_press_slot; thSlot on_button_release_slot; CL_Surface sur; CL_Surface q_mark; bool visible; int x_pos, y_pos; AdventObj* marked_obj; public: Coin (); ~Coin () {} void draw (); void update (); void on_button_press (CL_InputDevice *device, const CL_Key &key); void on_button_release (CL_InputDevice *device, const CL_Key &key); }; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 2352 Text-content-md5: cd12304660637611447b07f647362d39 Content-length: 2352 // $Id: GuileAdventObj.cc,v 1.2 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { name = arg_name; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : name (arg_name), pos (arg_pos), width (arg_width), height (arg_height) { } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::draw_world () { if (sur) sur.put_screen (pos.x, pos.y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x < x && pos.x + width > x && pos.y < y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2002 Text-content-md5: b69b8e2638de90e0a93536654d21835a Content-length: 2002 // $Id: GuileAdventObj.hh,v 1.2 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; /// The uniq id of this object instance int id; CL_Surface sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (std::string arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (std::string arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 2822 Text-content-md5: f297476b81907ca84d893dfd9f1fd0b5 Content-length: 2822 // $Id: ScenarioSmob.cc,v 1.3 2000/12/30 13:11:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("scenario:set-current", &ScenarioSmob::set_current_scenario); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 3705 Text-content-md5: 45bbe46912a69c23b1ce8ed730da878d Content-length: 3705 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=80, height=80); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); // EOF // Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 4835 Text-content-md5: e9c54a11839d981b8c8366730166e4ca Content-length: 4871 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (ice-9 syncase) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (println "look object - and here what you see.")) (else (println "Can't help you with " (car args))))) (else (println "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) ;; (println "LookAt: " args) (cond ((equal? (length args) 1) ;; (println "Object is a: " (get-obj (car args))) (look (get-obj (car args)))) (else (println "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (println "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (println "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (println "Don't know what you mean.")) )) (define-method walk ((obj )) (println "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (println "I am already there.")) (define-method gopen ((obj )) (println "Don't know what you mean.")) (define-method gopen ((obj )) (println "I can't open this ")); (name obj))) (define-method gclose ((obj )) (println "Don't know what you mean.")) (define-method gclose ((obj )) (println "I can't close this " (name obj))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (println "You picked up a " (name obj))) (else (println "You already have this " (name obj))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (println "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (println) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (println "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (println "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 11985 Text-content-md5: c45062639aa9fe5e474ab0fcab7094fe Content-length: 11985 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define game-scenario:gateway-objects (list (make #:adv:bind (advent:makeobj-surface "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj-surface "door" "door_closed" 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) (println game-scenario:gateway-objects) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Objects (define-class ()) (define-method name ((obj )) "plant") (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define game-scenario:outdoor-objects (list (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) (make #:adv:bind (advent:makeobj-empty "NextWay" 0 260 70 220)) )) (define game-scenario:outdoor-bind (scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (define-class ()) (define-method name ((obj )) "WayToDoor") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor4-bind) (set! *current-scenario* game-scenario:outdoor4-objects)) (define-class ()) (define-method name ((obj )) "plate") (define-method use ((obj )) (println "You see a plate")) (define game-scenario:outdoor2-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 560 320 80 160)) (make #:adv:bind (advent:makeobj-empty "WayToDoor" 585 260 55 40)) (make #:adv:bind (advent:makeobj-empty "plate" 210 300 40 40)) )) (define game-scenario:outdoor2-bind (scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects)) (define game-scenario:outdoor3-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 440 200 130 140)))) (define game-scenario:outdoor3-bind (scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define game-scenario:outdoor4-objects '()) (define game-scenario:outdoor4-bind (scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Revision-number: 11 Prop-content-length: 128 Content-length: 128 K 7 svn:log V 26 *** empty log message *** K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-30T13:15:32.000000Z PROPS-END Node-path: trunk/prototype/.cvsignore Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 107 Text-content-md5: c0b637d0a78be1090011453ab821e3c2 Content-length: 117 PROPS-END .cvsignore config.log config.h config.cache config.status stamp-h1 Makefile .deps advent stamp-h configure Revision-number: 12 Prop-content-length: 132 Content-length: 132 K 7 svn:log V 30 Some more object interactions K 10 svn:author V 7 grumbel K 8 svn:date V 27 2000-12-30T14:56:05.000000Z PROPS-END Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 3877 Text-content-md5: 7f2f556e290de7b5ac7e2e3e08ee8a44 Content-length: 3877 // $Id: AdventObjSmob.cc,v 1.5 2000/12/30 14:56:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (SCM_CHARS (arg_name), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (SCM_CHARS(arg_name), CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 2546 Text-content-md5: 35c24c79504fe5ce69b24dc4e1a8e6c4 Content-length: 2546 // $Id: GuileAdventObj.cc,v 1.3 2000/12/30 14:56:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { name = arg_name; surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : name (arg_name), pos (arg_pos), width (arg_width), height (arg_height) { surface_visible = true; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x < x && pos.x + width > x && pos.y < y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2027 Text-content-md5: f661ccd6e45c03d6d091500d1ebdfdbc Content-length: 2027 // $Id: GuileAdventObj.hh,v 1.3 2000/12/30 14:56:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (std::string arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (std::string arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 3711 Text-content-md5: 05cb0f93063802a7a605e5143504f3cb Content-length: 3711 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=80, height=80); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); // EOF // Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 13074 Text-content-md5: cd759ca2dcd2c4e1279201ce4e0f0373 Content-length: 13074 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "chest") (define-method gopen ((obj )) (println "name: " (name obj)) (println "gopen1: " obj) (println "gopen2: " (adv:bind obj)) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (println "Open chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (println "Closed chest") (set! (closed obj) #t)) )) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (println "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (println "You see a broken window, looks like you broke it.") (println "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define game-scenario:gateway-objects (list (make #:adv:bind (advent:makeobj-surface "chest" "chest_closed" 214 331 230)) (make #:adv:bind (advent:makeobj-surface "door" "door_closed" 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) (println game-scenario:gateway-objects) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Objects (define-class ()) (define-method name ((obj )) "plant") (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define game-scenario:outdoor-objects (list (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) (make #:adv:bind (advent:makeobj-empty "NextWay" 0 260 70 220)) )) (define game-scenario:outdoor-bind (scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (define-class ()) (define-method name ((obj )) "WayToDoor") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor4-bind) (set! *current-scenario* game-scenario:outdoor4-objects)) (define-class ()) (define-method name ((obj )) "plate") (define-method use ((obj )) (println "You see a plate")) (define game-scenario:outdoor2-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 560 320 80 160)) (make #:adv:bind (advent:makeobj-empty "WayToDoor" 585 260 55 40)) (make #:adv:bind (advent:makeobj-empty "plate" 210 300 40 40)) )) (define game-scenario:outdoor2-bind (scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects)) (define game-scenario:outdoor3-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 440 200 130 140)))) (define game-scenario:outdoor3-bind (scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "console") (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) (make #:adv:bind (advent:makeobj-surface "console" "console" 250 398 228)) (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Revision-number: 13 Prop-content-length: 134 Content-length: 134 K 7 svn:log V 32 Some syntax extension for guile K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-07T13:13:30.000000Z PROPS-END Node-path: trunk/prototype/guile/syntax-ext.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1138 Text-content-md5: 9791782208c3b876c32e9b04023936fd Content-length: 1148 PROPS-END (use-modules (ice-9 syncase)) (define-syntax adv:define-object (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) (eval `(define type (make ,classname))) )) ((_ type (name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value value ;; #:init-keyword #:,(string->symbol "#:name") ) ...)) (eval `(define type (make ,classname))) )) )) (define-syntax adv:define-class (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) )) ((_ type (name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value value) ...)) )) )) ;; EOF ;; Revision-number: 14 Prop-content-length: 141 Content-length: 141 K 7 svn:log V 39 Some scheme macros and dialog stuff... K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-10T18:09:00.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 3891 Text-content-md5: 72a7ec7cae01d88d296738dcff3d6009 Content-length: 3891 // $Id: Advent.cc,v 1.4 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" Advent app; Inventory inventory; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); dialog.update (); Scenario::current->draw (); coin.draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/AdventObj.cc Node-kind: file Node-action: change Text-content-length: 1213 Text-content-md5: 330aed8b96f8189edc126615bb1cb281 Content-length: 1213 // $Id: AdventObj.cc,v 1.4 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Scenario.hh" #include "Advent.hh" #include "AdventObj.hh" SurfaceAdvObj::SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos) : AdventObj (s) { sur = arg_sur; pos = arg_pos; } void SurfaceAdvObj::draw_world () { sur.put_screen (pos.x, pos.y); } /* EOF */ Node-path: trunk/prototype/AdventObj.hh Node-kind: file Node-action: change Text-content-length: 2178 Text-content-md5: 3c106d8632074e6a5119a7b2cb56f12b Content-length: 2178 // $Id: AdventObj.hh,v 1.3 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJ_HH #define ADVENTOBJ_HH #include #include "Position.hh" class Scenario; class AdventObj { protected: //Scenario* scenario; public: /// Empty default constructor AdventObj () {} AdventObj (Scenario* s) { //scenario = s; } /// Empty default destructor virtual ~AdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update () {} /// Draw the object to the world virtual void draw_world () {} /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual bool is_at (int x, int y) { return false; } virtual std::string get_name () { return "-- unset --"; } virtual float get_z_pos () { return 0.0; } }; // Little helper class for sort() struct AdventObj_less : public binary_function { bool operator() (AdventObj* a, AdventObj* b) const { return a->get_z_pos () < b->get_z_pos (); } }; class SurfaceAdvObj : public AdventObj { private: CL_Vector pos; CL_Surface sur; public: SurfaceAdvObj (Scenario* s, const CL_Surface& arg_sur, const CL_Vector& arg_pos); ~SurfaceAdvObj () {} void draw_world (); float get_z_pos () { return pos.z; } }; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 4159 Text-content-md5: 2170b14307a804fcf3ea6dd45adc007a Content-length: 4159 // $Id: Coin.cc,v 1.5 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - (sur.get_width ()/2) && key.x < x_pos + (sur.get_width ()/2) && key.y > y_pos - (sur.get_height ()/2) && key.y < y_pos + (sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 2548 Text-content-md5: 341e822f46bbf8097dd03526b0ec5787 Content-length: 2548 // $Id: GuileAdventObj.cc,v 1.4 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { name = arg_name; surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (std::string arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : name (arg_name), pos (arg_pos), width (arg_width), height (arg_height) { surface_visible = true; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/Makefile.am Node-kind: file Node-action: change Text-content-length: 618 Text-content-md5: 48bb47964129fa5b240537460273b215 Content-length: 618 bindir=$(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh \ Advent.hh Background.hh Font.hh Scenario.cc \ AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh \ AdventObj.hh Coin.hh GuileAdventObj.hh \ AdventObjSmob.cc CollisionMap.cc Inventory.cc \ AdventObjSmob.hh CollisionMap.hh Inventory.hh \ ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr \ data/images/*.png data/images/*.jpg # EOF # Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: change Text-content-length: 12705 Text-content-md5: 35f6fd16a9392cf7dfb4b30217beccdc Content-length: 12705 # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o \ ScenarioSmob.o Dialog.o Guy.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best DEP_FILES = .deps/Advent.P .deps/AdventObj.P .deps/AdventObjSmob.P \ .deps/Background.P .deps/Coin.P .deps/CollisionMap.P .deps/Dialog.P \ .deps/Font.P .deps/GuileAdventObj.P .deps/Guy.P .deps/Inventory.P \ .deps/Scenario.P .deps/ScenarioSmob.P SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp %.o: %.cc @echo '$(CXXCOMPILE) -c $<'; \ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.cc @echo '$(LTCXXCOMPILE) -c $<'; \ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-depend distclean-generic \ clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir mostlyclean-depend \ distclean-depend clean-depend maintainer-clean-depend info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3303 Text-content-md5: bfb200b0326e7f84e020663734820add Content-length: 3303 // $Id: Scenario.cc,v 1.4 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (new Guy ()); std::cout << "Objects: " << objects.size() << std::endl; std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 2872 Text-content-md5: 54d8f6042eb74db9211d2d947b3124fe Content-length: 2872 // $Id: ScenarioSmob.cc,v 1.4 2001/01/10 18:09:00 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("scenario:set-current", &ScenarioSmob::set_current_scenario); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/data/images/retriever_coin.png Node-kind: file Node-action: change Text-content-length: 10805 Text-content-md5: e818eb42bb737c51bd7bf738c9e6e596 Content-length: 10805 PNG  IHDRzzpYGgAMA abKGD pHYs  d_tIME   IDATx}GsYK$RIbK*ub~,j~,f"^uDE4U]%Cix.N&4"! y~{|tMtMtMtMtMtMtMtMtMtMtMtMtMtMtMWOҧ12I_>JC^?9js'l&}o$Iz(I$ɐ$'ߧ{ $7r< ?!πn.v\j46MSOƠ.wFH/J\c{'=R_yLzVeәvREۅie,Lӄiz0=y^x^H4 kk4wsܿB=OL$q-65%I$Ip\p\xJ'0|>\.0Bn7 q`\.:LӄB0 I@ ^'8vAUUȲ,UEct:"zEy -5(a<|#4i0 }[(&8\$? \.qD=z= Xu](4 , 5MC "$=tt:Ga~~>?rW@[wfg_)В$=4MS2 ~LMMabbth@@PPPvO/ "!B4h& );q@$I@BVX4nh&L"/.1UI@ D"=88H޻w/YTZc ɼhzݧ}$!H| SSSBBA!1h4[8ܹh4 -@zB>x4}Ip$~ Àx<|zb}ڏiOthZBܹD"ɿ_ޡo~N sp?*GK(˿KVow޻wDo>!"ڷ[GHH:t:!Z7$IB)mE`} |w @ta2dghqqD`t:ŢT*˗Dff69~_A -LHZi&Bzv|b[7Ђz#hʭN;G;rUA.P(ed2<{ [T*x{l>Ą#V)dXi8}8Dz|p]0RE`"۴vٙ"E "Y4m!&jjawwWWבNfńnB!aB0M&5RqkIQw]m(P($4-y΀>nXA&Pq*= ܹܥzSVvT&666,H3/h4+a@82r@N1XF0LiIt&l6Q@^= $hh L 3eXmc ú/s(wp/ '>RM`o[D#u5 ~2 <D,\K(_]D}^AF@\FRA4E<,˨T*V4 hTN|鼴l>^H=p@pߏqܺu B4El6Oq7TUq,E(B4=aCUUq-GC@C^GΓnH$p8 ]zF-Z-!n '1eXgC@!"(֭[HBԩ*>֙@kPl|GNrWUU(F!|򊢠n H ɠnlZ>ҠZ"L"L0 AR)؁f`0}{@~!HWE J\l}+ !;a&]UUZ-HR"r7 {EQz1>>.+0wM`JJON ̫z# QHf EGE׺lkq/x/Iz<dYLLL Lb{{4 Dh4A㱄BMDE.s2HbB|ppm(rLM,@˲,ܟZ ޽zX\\͛7 P,qtt$bx%G[}y<d2baa7oD 'ܨ<M3O,sf2vQ.Q* += +p0OM؟gKO%P+4/Ľ{DrD^6.U]ݻYuY5;)]N G԰r! L^WT{ܜv̧t:z.rݒ$سi8t(B,C0< l2% ah7Ci$@n~aF}60ZE+ =W`É8'% dre~wtt~ Jn­[ fqxxC!ȻG^P($R( 2"ְ}87Pp dPJ-9oݺ%Ge<) gEe@e"N# &4LDRA\(|x `~~^Ro^J{Ni禑ssh3u\~p8ILLLGG<ݮ Ąg9u^U;P.\.'kZ:.>O(eY@ᢛE@0类k񰑙ӊx$(( |bZ-T*Ȳ ܼyD"ž?+*hUݶ(GDgŵlIDDN=4]ׅǍ$ MB"@iۨT*߇(„r&& jE.N(Ll c#b45MC^GTq:33G͛>w"PhxOt:V8::hGQHUU모&#ZiPmFd2D"ФM2Qm:J<`||MnRvXM+RIDZ 4(;" .4M$ȔH$ VA3  x>̼@eP ,XvJ v,Z]] 4M^{vM`{].po҇) N8:dFC"Ą%ITUŻw rvbH$vL0D8$6A!V>ܝT;FHi.aʈ=0jFRh2|^DVNd*bWEФO?R*胫Utt]ojt Ȳh4p8,L#Z{^q*ǽ1qMFv=LL\ǎI$  HiB9/4zdv߼yzZ/>0JjD""y~E1q4-h ~,$rl6u4&txtկwww-@>Jlnn Q++hKF"H;Vc2/eQtfl?QTܫF / yA=ghχ߫{{{_.cZ7I"^c[m]8%{i N$iqa2M t< B:CG F7M%}}"<Wgzz󱱱n:%<4M[Z(Vj/T,{{{уJT!Ą2;C +oAwPŏ<pȶ{t@p8[ZZ,..g0 TUT*QC=Ӄ>eYpWaD|Kڟ{pȦݻw7n8b4 h*糑/>EQGGGa> d T&mL&/˦Tf)8hnCݑql T*v[k4mM 9CP,d乹98-aDրB?9dsWyB&8C;}'T*ݻwZ<(s9$ ܿDBzmR$x5P([ZZκfffL&/4^η{)Jpՙ;M\ KkR x], 4~%IE4%q$I,--RɃ7/M;\iA{MU̮{bt:(J(X__GPĨ)EvcvvVyreWʲ7n=zqalwwwrbb"NCSSŠk"`!z.-2?m~y}tQ'ZQ{T*[h4D>o3mkǃqdY?MLL޽C2<ɼ,[vퟛ0yhvJڹByMB(rX]]JLF|NrL&)DQ .=8l|\.$)D033Z;rǍitl6E q_ wwrF!Oi&vww:,>3͉!={Z,,,f8MEA\F8h=3Aqn{=c_T*l6d2)'٣ {4 Ǐ믿y96޾}C&,2٬Pz87X0v8MrD%_v,I* +!Enݺ1p ~A*\ <4@m@b* JN#Hۤlfu%;4 AQyFdnȲzz.HsssM1R(@35}S`^%;::Ύ~HGU{vZ,kΪi5e\.I{4nܸp8-lmmnH/L&l?EO!Pn˗/-y. Hۃ(xy~~Pb.x[*iEt|jJJj0$1t:yb1,--d}I]AUUыP(1X&Ԟzī*ɾ򗿈rYXZZ۷111EQpxxZFaQ ⢥߁S=y!q>P(D"a۷o#H@NWUާipwPUE8F,_|`ߖJ%$ ׿aOZdJ=V(nWBL&cL8>>.ZQQ~F@˓$ܹ;w8i@Ɛ·E|^J#Lbyy?&:jvR)it^/8VVV0??O }w촊J;GK , .vh6"hTḧCP~24MC$8Vȩ@5DU*Q;h4P,} g] rT*熰a'n=M{4BxIVXYYA"AEёІ۔Jm233of7n8+½]'իW*ggg-P"8WzΎ&@?=czzZ*&<2v&]D_cFCr2aLRBL("Rhg{{{En0ĭ[ſ;;;Yܿ$ 6?ȳhEvND1??UUqpp Nu\1MSv}ˎD"H&z߷pt,C,.B(JbD"HRI:F*Qvk^wZL +c`@ $I~ZeN;W~?&''-╀7)HDZL&]K,ۍ9K'з߿CV<EiNxaGVO,);h@ Ei'Lc)4p"IA&x㘞Q%IFI#3vC@rrTz >cEp7EIeLNNB$$pxx=]wT*u.͜oEׅ ~Q<ӧjuhȯMq_.@fU:s8d,*rg͛/&D±\.\.cww;;;V0MSᰥW{,eRWIpT*)\j5zaqЉWVEI*DP(`mm ޽CTad2|g\.O^5a'lh #I,^ u8l4rDZEҕh$4rn6¦%q^*[ll^ IDATlnfm<Į>/t-uu|""DNL@ ;::;yxܛ}%7N42;8Ye$ !Q z6t |u44i|^tR`}}v㢀TpxxhyvvJ,$-Gz=4/ަ{}Od2'{.{.]VM<+|Jf{2: yB!MBt]V,˖=Z-`vO$K"k||DB$QП[N'Dvo;rPb=r\.LMM᫯Ғ5m\\ӵdonnX[[nnn6u]o‚Ķ{? =@mj5oV[vh4**~l'%m(]&kvTn`JN߬ T*{N{N'irSkU\;)%::m6&%N@ M_5ODE@sʨ@{4p=Nvt?݉"ᤘ+`W5 MG=Ĺ93sIh~'SεN(&z]9Nf^oaĹcm0L>Da\@N Ϝ^_>dG$3= +h?K{MtMtMtMhN ^DIENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 3713 Text-content-md5: 0385aa7d7069c8752fbf213604c3ccf9 Content-length: 3713 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); // EOF // Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 4932 Text-content-md5: 728f9b5ad6ee2c0bdb3a08942c830441 Content-length: 4968 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (dialog:add "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 7171 Text-content-md5: 6ab3c97aa8b9671dccdf3168308c13a8 Content-length: 7171 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (closed #:init-value #t #:accessor closed)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") (define-method name ((obj )) "door") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (dialog:add "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (dialog:add "You see a broken window, looks like you broke it.") (dialog:add "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Node-path: trunk/prototype/guile/syntax-ext.scm Node-kind: file Node-action: change Text-content-length: 1215 Text-content-md5: ade6cebbb5e00a3d8e190ee47c21a517 Content-length: 1215 (use-modules (ice-9 syncase)) (define-syntax adv:define-object (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) (eval `(define type (make ,classname))) )) ((_ type str-name (mem-name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value str-name) (mem-name #:accessor mem-name #:init-value value ;; #:init-keyword #:,(string->symbol "#:name") ) ...)) (eval `(define type (make ,classname))) )) )) (define-syntax adv:define-class (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) )) ((_ type (name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value value) ...)) )) )) ;; EOF ;; Revision-number: 15 Prop-content-length: 150 Content-length: 150 K 7 svn:log V 48 Dialog system and some guile code seperation... K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-10T18:47:04.000000Z PROPS-END Node-path: trunk/prototype/Dialog.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2125 Text-content-md5: 94edf567578948ba6478bcc1d344da70 Content-length: 2135 PROPS-END // $Id: Dialog.cc,v 1.1 2001/01/10 18:47:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Font.hh" #include "Dialog.hh" Dialog dialog; void Dialog::draw () { if (!texts.empty ()) { DialogMessage& message = texts.front (); CL_Display::fill_rect (320 - 200, 150 - 40, 320 + 200, 150 + 50, 0.0, 0.0, 0.0, 0.5); font ("font")->print_center (320, 150, message.text.c_str ()); } } void Dialog::update () { if (!texts.empty ()) { DialogMessage& message = texts.front (); if (message.display_time < 0) texts.pop (); else message.display_time -= 1; } } void Dialog::add (const DialogMessage& message) { texts.push (message); } SCM Dialog::dialog_1 (SCM text) { puts ("Dialog1"); char * char_str = SCM_CHARS (text); printf ("CharStr: %s\n", char_str); std::string str (char_str); dialog.texts.erase (dialog.texts.begin (), dialog.texts.end ()); dialog.texts.push (DialogMessage (str, str.length () * 2)); return SCM_UNSPECIFIED; } SCM dialog_add (SCM text) { puts (SCM_CHARS (text)); return SCM_UNSPECIFIED; } void Dialog::init () { std::cout << "Registering guile stuff..." << std::endl; gh_new_procedure1_0 ("dialog:add2", &Dialog::dialog_1); std::cout << "Registering guile stuff...done" << std::endl; } /* EOF */ Node-path: trunk/prototype/Dialog.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1460 Text-content-md5: cb1b1317976f267fb1cdcf772b7104bf Content-length: 1470 PROPS-END // $Id: Dialog.hh,v 1.1 2001/01/10 18:47:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef DIALOG_HH #define DIALOG_HH #include #include class DialogMessage { public: std::string text; int display_time; DialogMessage (const std::string text, const int d_time) { this->text = text; display_time = d_time; } }; class Dialog { private: std::queue texts; public: Dialog () {} virtual ~Dialog () {} void add (const DialogMessage& message); void draw (); void update (); // Guile bindings static SCM dialog_1 (SCM text); static void init (); }; extern Dialog dialog; #endif /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3285 Text-content-md5: a8c12c4a50e675cdfb0a3d6f97981dcf Content-length: 3295 PROPS-END // $Id: Guy.cc,v 1.1 2001/01/10 18:47:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; delta = 4.0; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Guy::on_button_press)); } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Guy::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } /* EOF */ Node-path: trunk/prototype/Guy.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1516 Text-content-md5: 4adcff2d886bf537e83e077fc4f63432 Content-length: 1526 PROPS-END // $Id: Guy.hh,v 1.1 2001/01/10 18:47:04 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUY_HH #define GUY_HH #include #include "AdventObj.hh" class Guy : public AdventObj { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; thSlot on_button_press_slot; CL_Vector direction; CL_Vector pos; CL_Vector target; float delta; public: Guy (); ~Guy (); bool on_target (); void update (); void draw_world (); void on_button_press(CL_InputDevice *device, const CL_Key &key); float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } }; #endif /* EOF */ Node-path: trunk/prototype/TODO Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 208 Text-content-md5: 6c0c04cf6b9eab1ec32c669fb346deb8 Content-length: 218 PROPS-END * handling of object collision - for example usefull when mogli should automatically brought to a no scenario, with out extra clicking * handling of animated objects * messages and dialogs * text output Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 989 Text-content-md5: 3604c97aa41eac6a38caa375717841ca Content-length: 999 PROPS-END (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface (name obj) surface x y z)) obj) (adv:define-object scenario1:chest "Chest" (closed #t)) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define game-scenario:gateway-objects (list (bind-obj scenario1:chest "chest_closed" 214 331 230) (make #:adv:bind (advent:makeobj-surface "door" "door_closed" 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1099 Text-content-md5: 36da6676714f684efd7272c3596c9785 Content-length: 1109 PROPS-END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Objects (define-class ()) (define-method name ((obj )) "plant") (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define game-scenario:outdoor-objects (list (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) (make #:adv:bind (advent:makeobj-empty "NextWay" 0 260 70 220)) )) (define game-scenario:outdoor-bind (scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1546 Text-content-md5: 0d7a682cb0adef6228a54f8b76542efd Content-length: 1556 PROPS-END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (define-class ()) (define-method name ((obj )) "WayToDoor") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor4-bind) (set! *current-scenario* game-scenario:outdoor4-objects)) (define-class ()) (define-method name ((obj )) "plate") (define-method use ((obj )) (dialog:add "You see a plate")) (define game-scenario:outdoor2-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 560 320 80 160)) (make #:adv:bind (advent:makeobj-empty "WayToDoor" 585 260 55 40)) (make #:adv:bind (advent:makeobj-empty "plate" 210 300 40 40)) )) (define game-scenario:outdoor2-bind (scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario4.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 919 Text-content-md5: 6362c379769414c2195816c44aba7eeb Content-length: 929 PROPS-END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects)) (define game-scenario:outdoor3-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 440 200 130 140)))) (define game-scenario:outdoor3-bind (scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1588 Text-content-md5: 1f3fec2e573df64c91c9876143fc91d5 Content-length: 1598 PROPS-END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "console") (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) (make #:adv:bind (advent:makeobj-surface "console" "console" 250 398 228)) (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Revision-number: 16 Prop-content-length: 142 Content-length: 142 K 7 svn:log V 40 Added update loop for adventure objects K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-11T21:41:56.000000Z PROPS-END Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 3854 Text-content-md5: 0df2f9d392007c0763eaaef7674f6e85 Content-length: 3854 // $Id: AdventObjSmob.cc,v 1.6 2001/01/11 21:41:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Dialog.cc Node-kind: file Node-action: change Text-content-length: 2145 Text-content-md5: 1355a5f5ef6b3bfbb893f04ed47135c3 Content-length: 2145 // $Id: Dialog.cc,v 1.2 2001/01/11 21:41:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Font.hh" #include "Dialog.hh" Dialog dialog; void Dialog::draw () { if (!texts.empty ()) { DialogMessage& message = texts.front (); CL_Display::fill_rect (320 - 200, 150 - 40, 320 + 200, 150 + 50, 0.0, 0.0, 0.0, 0.5); font ("font")->print_center (320, 150, message.text.c_str ()); } } void Dialog::update () { if (!texts.empty ()) { DialogMessage& message = texts.front (); if (message.display_time < 0) texts.pop (); else message.display_time -= 1; } } void Dialog::add (const DialogMessage& message) { texts.push (message); } SCM Dialog::dialog_1 (SCM text) { puts ("Dialog1"); char * char_str = SCM_CHARS (text); printf ("CharStr: %s\n", char_str); std::string str (char_str); while (!dialog.texts.empty()) dialog.texts.pop (); //dialog.texts.clear (); dialog.texts.push (DialogMessage (str, str.length () * 2)); return SCM_UNSPECIFIED; } SCM dialog_add (SCM text) { puts (SCM_CHARS (text)); return SCM_UNSPECIFIED; } void Dialog::init () { std::cout << "Registering guile stuff..." << std::endl; gh_new_procedure1_0 ("dialog:add2", &Dialog::dialog_1); std::cout << "Registering guile stuff...done" << std::endl; } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 3437 Text-content-md5: 4ad0690056039af7be4fb42dea688b08 Content-length: 3437 // $Id: GuileAdventObj.cc,v 1.5 2001/01/11 21:41:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } scm_object = SCM_BOOL_F; surface_visible = true; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2049 Text-content-md5: a1f8e06ab6641f5325066ecc4a30bb3a Content-length: 2049 // $Id: GuileAdventObj.hh,v 1.4 2001/01/11 21:41:56 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y) {} virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5116 Text-content-md5: a6cb53d9282e7281d8569e51fe58da8a Content-length: 5152 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (dialog:add "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 1070 Text-content-md5: 8d57a80fb34a325645fcf79b0c49d650 Content-length: 1070 (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (adv:define-object scenario1:chest "Chest" (closed #t)) ;;(define-method update ((obj )) ;; (println "Updating chest") ;; ) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define game-scenario:gateway-objects (list (bind-obj scenario1:chest "chest_closed" 214 331 230) (make #:adv:bind (advent:makeobj-surface "door" "door_closed" 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Revision-number: 17 Prop-content-length: 117 Content-length: 117 K 7 svn:log V 15 little cleanup K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-11T21:51:00.000000Z PROPS-END Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5228 Text-content-md5: b382c80cded034b94494b1161dd7c5a4 Content-length: 5264 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (dialog:add "Invectory: ") (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 1399 Text-content-md5: 7b7377192b00448ce32dd0df62f09383 Content-length: 1399 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; The update methode is called once a game loop (15 times per second) ;;(define-method update ((obj )) ;; (println "Updating chest")) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list (bind-obj scenario1:chest "chest_closed" 214 331 230) (make #:adv:bind (advent:makeobj-surface "door" "door_closed" 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Revision-number: 18 Prop-content-length: 215 Content-length: 215 K 7 svn:log V 112 Added another door and an example of the update functio (which might need to be replaced by a timeout-callback) K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-12T08:31:43.000000Z PROPS-END Node-path: trunk/prototype/data/images/s2_door_closed.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6389 Text-content-md5: 0e2f885ddbef0c606ea571c4b627c7dc Content-length: 6399 PROPS-END PNG  IHDR`KggAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~]}bKGDH pHYs  ~tIME ).:kIDATx[WZ]if7obԨر;؍FbKElEEi"G=Yors眽e.ryʀϟpww\\X E&i7no܈ƞI>9վ>PSR\돏Uc}p lLH14B鹹<TR*H췉~Ѐt77bqffssVzyi0_'&~`2//wvh4&S&;:0noM5]^@Pt ebbq P `.ʲ| F Koo++z'T_{r&Nt4T򥹹=?LNOGbM22**2ԴKlbF#ykPms3<x [[''k3<<""޽OJ 󳲲4+77/_::ZX8;;8X@pğ?UK,2>.S^USH췉T&@PQni^\lnff痖UULOH=fח74奤$';9|_'%GF{z"!!%%uuYY^^55''Juw73&$$'74?>\bry?ؘV{?6CbbUkHHY{vvi;hꪏFD|<7%(B! ֖ѨRq8x|l,Ⲷf477&S{{j*F/.*SS*<mbBauuEE]uu&qfWv6XZ X,,bd@Pz{-,i ֹ\3Y(wwkRRcb23kk77憇GFKlf&997w{z\]ǿ E&pښ!76~Q_O2QQϞLL@@ך_[ -YYyy\^LlvBBxxnn^8\mmk+pPD|h2FEdf.,|L&2=M l6599m@~׷ B"d`^_ ^PJmoM@@DDnHTY9442H췉hmm~nnSf|BEGwwZTb-../pSSxVEKKs3'AfomRXT®u};2@IggSfOy99\b徾AA55Źx|zopLv F#nl"-Jcc8tSSU7//_\\llq=TؠR Dϟe013ӫW))x< {{z}I_pp{;966?H췉%%Y[GGD&ӯ_!! mm B!`8\]]ʵ^9mcRZI&s8۰x6F0///.5lt:$22$*:H.1(23Aj ܜDje4NOM*u}H$ acFKL Q adxX.?8쌏훛+ۨ(GG P.1[ۤ;#<<,wuut4> M*ETV 6UTW3X\]e0ՙI2@RtcaDZ\lks5=1Ͽ9:2 o0ϯgao1]\H$7hFjnBx?̐D"hBf2E"_nn`~`|[76&scH\^#[[kkfCB (;>."+-,lnKNݽolGGGAE"A:_Z"hN_ZPyazzllanlrggCCۿ}on5ƌO>~p@WSX,>?$ɩB<ꕧgnndd^#& *Ꚓmv6?9R1++ @&HD"?=<==005E @@ GG؂;;o襤e3޼)(4ZZZ\R#)?X,y fiB^]ZZ&'gg''?\bPwt QQoޤ deٕ%LM 555665AnlS_58eEDooCݳ4瞞D;% [[ XbApqUvv66''^~~=\b"#>~ JV(U(4A ReXa0==߾Rkk$rjɤRطoa@jiF[[g'B"69rr{vᤧظ \^VT 0GbML ##߼Q$K pu3 S(|6LL@8pJK?|xٹJ]\\Xl:ÁH"hvwafh4p JxJ7fg2B__/{{Kf r9O &0B\~rrvҌg|}bE>qqvJ%L6{v>!J{֡XBANFsz*Lz}Z#&vpFļ@hqq>>NOLpPPaՅ­Ɩ0]++??2 ǝ^\rFGFGǧt>Jutd0H$##_ONno[Z.d;{u?zTwf.;8844a@" ww3|X<2RS矑<8 hGGWWGGk+ȣ ͍NL,,kkL?$?Š\]LryQQB%64_UEpNHKKX,;$cggK d}}8Ą@VFD<^WP]=>n2i4WW"<B!hL@L:I""Zq41==(Tm-sr>rL&K$r9H$R)`ln2 ȿpHII^ &vegF`_`{;: kvz td3{{H6GbM +-0B57=472%Iodj4FٙT BT ϟssqqNN\L[ X㳳fH L.,,-H0AX]%hT*j.ɓ\1TK9 ))8=<8??++##;;--++;Çܲ2+]]--]]==33SS$Reezz` nsS$ۻ>8AJgfzzni)+KMEU*&BϞ98ޞ__?\baafa0))?џ?75fd~VRMhTZKVVNMA.-MK-(y?ZZ*U*jklQ$rq?[ogF  sW؋`ǻ\߽7(' ;09.(HLG" goYY||JАR9=fXO>{VR6!χK aODD^^DDXXFFY ]宮qXPC||99olm== e(##==;<<޿ NMX왥eVHtsc0<%$dP4\\VĆVUA3xhtQȘ0bb"#HOOGG{{>>(TAAppT4BFFee߾a055YY--X@ppQGGYY))++|%zxxt$ bVӁ οR)AOx<xCSS a2BYYmxxrO?~` KJӓcbbc`//OOoo$>ЄZ] 4襤@QW__[pA+5{_^tJ֖^-`@9o0s\\\]ݙ]]lI$L&<6͐rz23JJ>}jnF1斖o &>oez[ c=? 1vv6̀<5*L&Ax<mm˅"Z_,leNѠ'2.|z }Jƌ}F tp|xcaJ_ y<.|lwwgG"^E<~jjvviQ*t:P7VV /db17,Ti8::<3[$;==9X$Z]H췉́%B;ys*t|)2DVK$B!4 d{[ P@a5sH&S(`hR3Df0 Rrxv4$κ.IENDB` Node-path: trunk/prototype/data/images/s2_door_opened.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 6373 Text-content-md5: 6318951ccbab89ec50c191d9bfab51a6 Content-length: 6383 PROPS-END PNG  IHDR`KggAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~]}bKGDH pHYs  ~tIME Fq[IDATxS}_;sGM콷QccCEX&QbA@(b{=3<6~g >vorNtzlYYpǟ_ϟؼ|ϞYY98ٽzeohoeWpp`3eggchc⅕ϞxK[^AA{-Zm4ooH$ %]^.2ehhkzkktN\^^[?>>9=99?{xForreewǏ``2ȌXJj% ecQ JK6?>pSS ?փEr9B١P+sR)T[{jɩ(+#}S*Ҳ)y>Q*zqansl[\joBQmmMM"ɴv`AADbqqCCccaavvjjho''yyS(lv}}u5)2[[&ܜѸUmT*Dp3tzww{;SMMt:"ˀ挌/_ss/XBBf&F'$d,VAxxL MHBŽ{[ww/w23߿TTGF}lmD;::9{{Zf 66/x>**::**""%%55#q HWT`066aa /^^_[[׋N:;XXX]PPvvbbxx`E..ޯ^鯿\\- //77(xŒ< 67ۙOO++6jv b \]==CC莎.ENEuuTj]R\O"1%%HdF_Zf mm|>MMMuu|~MMI PYyzz~bk$%UWk4<^IIBRTxdGX09++!-((%eccm`[42"x,VWfXLt:oddxx̢9ajjrR.JluiFjd4ul;)%ݝHDuÁP **JJ>~qql>9|}_kk \\0bNHT.׶6xd&^?991!IRV3?64tvffTWWk98~~{ ^rgl,GI$AGGgHx23ml "oiqspr?( fiI)/gTvhq_1MyqvvnnjJX2"ù4NNkkmyr $zzzzh 66Bۣ߿ͫѯ_påDAo{QoTmQn.\TT^VQQ\^^^] ^j5`"zjJTa8[Z >8`ݭQׯ##33R|m0";˫OɩϢb*&zvddbB*5/0> 'rj ̌FPZĄ\TrZ\^^ҢR[[x<ꕛ|rҒ3_X89KG+, xxW׼<>bZHD&!p8ؕ䌌_{MMNM,%n|\./'t>ttq1::7y*9;a{8?;0hjg$'KL1?;:\\BC1p8bb23ޞ, &q8,LVl~~ndFF śi@@LB`|~)/۷PkYYy`\pxx8;H|~PP` TX==]]D*+kk+*H4 E$25IjU*EpOM>?ÇdLKHHJ"[Zffj} Y>6[ ILbxXXprh,LH;:2j??$>0ex Euu'Ɔ<{ѨVc_{z͝]_y}]RbooeUR`[[UUhWHJDUNmmg'=8$j&6SS:P( bT*H"J% եP]]A{3wyrx77f `gF?f0. tpr[[y>NM rqym"16{{<">hhc`r&3/HllY*U(Dˇy!6OJ.8LU)J$` KdRxNoR)xon&'56VWI3a03szOo=^0)) za`@ :<<;ikstjlJ'& JbHaz{[ZPH`()$O(LjlLh_WS*(6~H$p~nn浵< 1ёAAbqO^?8Fsvnm)tb1X0E"8z{7c;:44$ `$E&1XbKp&OO>`LOc0XB14$b1!NO///-MMI$)/G*FV+36&*ccFJ80;T*L틋`dM,njuwۻxx}`ލH(՞^[}ŪbdPJzzX,:W Hq8pv0zA~.4T$ZX[^>hkkys-m0{{;8Q(rH))-d8Phzprp`_GА\C >~D >J9m(Pb$lj:=177/Kppb"^XH"egHcPлw^S[[R厏+<2ԊT*XmZ286= ahzzrR`X_T ,b^JJiuu_.-}񂅅!Q(Xliitt||a!F zyyoQ@@PPH۷DBBbbA@$ON Lxnn}}v/#udDÇhtu?ϟm0~g"Ng2?~"13L&(O64STjVVH_Dtyzoބ"HdJJBBL LLL||dd@ϛ7(TXPWAq8(2M\ܳgϟC[6!2LK#Q(/Oπ*wsԄ,4:")==##%9gg[[o︸ذ7oS/0CC}|<<""||۷ ` LOK>=newwO`IՙE[@ H$"1/D⢢bcccH(QFE{{9998lsrG P":!D2BͭNL,.98߇ёF;9%'WTQ7=xFGff 1ƆѨIb1zVONp(DbRIwtBkRssQF`99<^QQ~>@p AA>>`mVTPм<k(AP^WW77?,E"koآ5|~aé~JP..')#?} `(4 ~=1<[tqq||p_%q\H(HM$pbBgHR(|HwwvΠbccǢݝ4ؘnn qtspzywwrb0@!dZXX^4 ʜu_]]\\Z2 e2vqqch}poo"X{{`dA{./}}vvzj0,-p$$>6J.@VOL@ ]^}~t9?K>חgfb*OOwvcX`ZYY_[[Wpyygdi`W8=RSݝ-ђ#!IENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 3920 Text-content-md5: f4a54d44a27c17b23523fdb74455a5cd Content-length: 3920 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); // EOF // Revision-number: 19 Prop-content-length: 215 Content-length: 215 K 7 svn:log V 112 Added another door and an example of the update functio (which might need to be replaced by a timeout-callback) K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-12T08:37:08.000000Z PROPS-END Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 6605 Text-content-md5: 36db31877a2f3a3515c1b9a9d5bee8b4 Content-length: 6605 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (dialog:add "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (dialog:add "You see a broken window, looks like you broke it.") (dialog:add "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 2465 Text-content-md5: 8bed81d7a43205584ec63d976f7e623e Content-length: 2465 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default (adv:define-object scenario1:door "Door" (closed #t)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list (bind-obj scenario1:chest "chest_closed" 214 331 230) (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: change Text-content-length: 1734 Text-content-md5: b89cd15b7ae479a7ac9b0b23f3150316 Content-length: 1734 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Objects (define-class ()) (define-method name ((obj )) "plant") (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (adv:define-object scenario2:door "Door" (foobar #f)) (define-method use ((obj )) (cond ((not (closed scenario1:door)) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects)) (else (dialog:add "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed scenario1:door) (advent:set-surface (adv:bind obj) "s2_door_opened") (set! (closed scenario1:door) #f)) (else (advent:set-surface (adv:bind obj) "s2_door_closed") (set! (closed scenario1:door) #t)) )) (define game-scenario:outdoor-objects (list (bind-obj scenario2:door "s2_door_opened" 236 247 0) (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) (make #:adv:bind (advent:makeobj-empty "NextWay" 0 260 70 220)) )) (define game-scenario:outdoor-bind (scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Revision-number: 20 Prop-content-length: 130 Content-length: 130 K 7 svn:log V 28 Some code for the inventory K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-12T23:37:25.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 3962 Text-content-md5: e8b203add8813d5bd6efefc81347fc6f Content-length: 3962 // $Id: Advent.cc,v 1.5 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); dialog.update (); inventory.update (); Scenario::current->draw (); coin.draw (); inventory.draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 4188 Text-content-md5: 12464e2b512e3067cba32a52e7e763eb Content-length: 4188 // $Id: Coin.cc,v 1.6 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; } void Coin::draw () { if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - ((int)sur.get_width ()/2) && key.x < x_pos + ((int) sur.get_width ()/2) && key.y > y_pos - ((int) sur.get_height ()/2) && key.y < y_pos + ((int) sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 3565 Text-content-md5: 1fea51228cb537e4f0ca0f46c0b4065e Content-length: 3565 // $Id: GuileAdventObj.cc,v 1.6 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } scm_object = SCM_BOOL_F; surface_visible = true; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } void GuileAdventObj::draw_inventory (int x, int y) { std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2047 Text-content-md5: 98b536702af194e8486c5f008a12daa1 Content-length: 2047 // $Id: GuileAdventObj.hh,v 1.5 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y); virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/Inventory.cc Node-kind: file Node-action: change Text-content-length: 2592 Text-content-md5: d35cebd17ba01c490a0d8c48826e38bc Content-length: 2592 // $Id: Inventory.cc,v 1.2 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "AdventObjSmob.hh" #include "Inventory.hh" Inventory inventory; Inventory::Inventory () { visible = false; } void Inventory::add (AdventObj* obj) { objects.push_back (obj); } void Inventory::remove (AdventObj* obj) { objects.remove (obj); } void Inventory::draw () { if (!visible) return; CL_Display::fill_rect (40, 40, 600, 440, 0.0, 0.0, 0.0, 0.5); int x = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_inventory (x, 0); x += 50; } } void Inventory::update () { if (CL_Mouse::get_x () < 40 || CL_Mouse::get_x () > 600 || CL_Mouse::get_y () < 40 || CL_Mouse::get_y () > 440) visible = false; } void Inventory::init () { puts ("Registering Inventory functions..."); gh_new_procedure1_0 ("inventory:add", &Inventory::add); gh_new_procedure1_0 ("inventory:remove", &Inventory::remove); gh_new_procedure0_0 ("inventory:show", &Inventory::static_show); //gh_new_procedure0_0 ("inventory:hide", &Inventory::static_show); } void Inventory::show () { puts ("Inventory showing show..."); inventory.visible = true; } SCM Inventory::static_show () { inventory.show (); return SCM_UNSPECIFIED; } SCM Inventory::add (SCM obj) { puts ("Adding object to inventory"); SCM smob = gh_call1 (gh_lookup ("adv:bind"), obj); AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* guile_obj = dynamic_cast(advobj->obj); inventory.objects.push_back (guile_obj); return SCM_UNSPECIFIED; } SCM Inventory::remove (SCM obj) { puts ("Removing object to inventory NOTIMPL"); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Inventory.hh Node-kind: file Node-action: change Text-content-length: 1508 Text-content-md5: 713dba24481e03d85fb9c0c80bd3adc5 Content-length: 1508 // $Id: Inventory.hh,v 1.2 2001/01/12 23:37:25 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef INVENTORY_HH #define INVENTORY_HH #include #include "AdventObj.hh" class Inventory { private: std::list objects; bool visible; public: Inventory (); virtual ~Inventory () {} void draw (); void update (); /// Show the inventory and allow the user to select or manipulate it void show (); /// Add void add (AdventObj*); /// Remove void remove (AdventObj*); // ..:: Guile Specific Stuff ::.. static void init (); static SCM add (SCM obj); static SCM remove (SCM obj); static SCM static_show (); }; extern Inventory inventory; #endif /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5258 Text-content-md5: 9ece2ef827fc2c303cc08e3cb70c5e6e Content-length: 5294 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #t #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 2612 Text-content-md5: ea74b61d7d3b1e41b3b37fd0376aa27e Content-length: 2612 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default (adv:define-object scenario1:door "Door" (closed #t)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list (bind-obj scenario1:chest "chest_closed" 214 331 230) (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Revision-number: 21 Prop-content-length: 155 Content-length: 155 K 7 svn:log V 53 Added stuff for inventory and for picking up objects K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-13T14:01:00.000000Z PROPS-END Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 4344 Text-content-md5: 21a6fb15a6ef055baa5e1da9071a6dcc Content-length: 4344 // $Id: AdventObjSmob.cc,v 1.7 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "helper.hh" #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); gh_new_procedure2_0("advent:set-inventory-surface", AdventObjSmob::set_inventory_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_inventory_surface (SCM obj, SCM name) { std::cout << "AdventObjSmob::set_inventory_surface" << std::endl; std::cout << "name: " << SCM_CHARS (name) << std::endl; GuileAdventObj* advobj = scm2GuileAdventObj (obj); std::cout << "Pointer: " << advobj << std::endl; advobj->set_inventory_surface (SCM_CHARS (name)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1564 Text-content-md5: c8615112072010d3d7ec663217a6245f Content-length: 1564 // $Id: AdventObjSmob.hh,v 1.4 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { AdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static SCM mark_obj (SCM smob); static scm_sizet free_obj (SCM smob); static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM makeobj_surface (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM makeobj_empty (SCM name, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM set_surface (SCM obj, SCM name); static SCM set_inventory_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 3911 Text-content-md5: bb2d358d40af9a12bbf996fded9958fa Content-length: 3911 // $Id: GuileAdventObj.cc,v 1.7 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } scm_object = SCM_BOOL_F; surface_visible = true; } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } void GuileAdventObj::draw_inventory (int x, int y) { std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2134 Text-content-md5: 1e0ee3188a2a7d413ca97302b8c3640f Content-length: 2134 // $Id: GuileAdventObj.hh,v 1.6 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Surface inventory_sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y); virtual void call (std::string func, std::string id); virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); virtual void set_inventory_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/Makefile.am Node-kind: file Node-action: change Text-content-length: 638 Text-content-md5: b0b924eb3f78c05d62918357c269ae63 Content-length: 638 bindir=$(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh \ Advent.hh Background.hh Font.hh Scenario.cc \ AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh \ AdventObj.hh Coin.hh GuileAdventObj.hh \ AdventObjSmob.cc CollisionMap.cc Inventory.cc \ AdventObjSmob.hh CollisionMap.hh Inventory.hh \ ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh helper.hh helper.cc # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr \ data/images/*.png data/images/*.jpg # EOF # Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: change Text-content-length: 12749 Text-content-md5: 0ea87e40975222a973232c77ccf982c3 Content-length: 12749 # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh helper.hh helper.cc # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o \ ScenarioSmob.o Dialog.o Guy.o helper.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best DEP_FILES = .deps/Advent.P .deps/AdventObj.P .deps/AdventObjSmob.P \ .deps/Background.P .deps/Coin.P .deps/CollisionMap.P .deps/Dialog.P \ .deps/Font.P .deps/GuileAdventObj.P .deps/Guy.P .deps/Inventory.P \ .deps/Scenario.P .deps/ScenarioSmob.P .deps/helper.P SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp %.o: %.cc @echo '$(CXXCOMPILE) -c $<'; \ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.cc @echo '$(LTCXXCOMPILE) -c $<'; \ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-depend distclean-generic \ clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir mostlyclean-depend \ distclean-depend clean-depend maintainer-clean-depend info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3514 Text-content-md5: e3a2d72bc0eda45bf5bb31efc6804ab0 Content-length: 3514 // $Id: Scenario.cc,v 1.5 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (new Guy ()); std::cout << "Objects: " << objects.size() << std::endl; std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } void Scenario::remove (AdventObj* obj) { std::list::iterator obj_iter; obj_iter = find (objects.begin (), objects.end (), obj); if (obj_iter != objects.end ()) objects.erase (obj_iter); } /* EOF */ Node-path: trunk/prototype/Scenario.hh Node-kind: file Node-action: change Text-content-length: 1806 Text-content-md5: 6c52dd0cac1f9832e7fee5ab44cef0b5 Content-length: 1806 // $Id: Scenario.hh,v 1.3 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIO_HH #define SCENARIO_HH #include "AdventObj.hh" #include "Background.hh" #include "CollisionMap.hh" #include class AdventObj; class Scenario { protected: std::list objects; Background* background; CollisionMap* colmap; std::string name; public: /// static std::list scenario_list; /// static Scenario* current; Scenario (std::string name, std::string background, std::string colmap, std::list objects); virtual ~Scenario (); static void set_current_scenario (std::string name); static void set_current_scenario (Scenario* scenario); virtual std::string get_name () { return name; } virtual void draw (); virtual void update (); virtual CollisionMap* get_colmap (); virtual AdventObj* get_object (int x, int y); virtual void add (AdventObj* obj); virtual void remove (AdventObj* obj); }; #endif /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3077 Text-content-md5: 8c461a8014f0fb70796afb14abda38cb Content-length: 3077 // $Id: ScenarioSmob.cc,v 1.5 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.hh Node-kind: file Node-action: change Text-content-length: 1518 Text-content-md5: fc4badc11662b00d0f831c9336baaf0a Content-length: 1518 // $Id: ScenarioSmob.hh,v 1.2 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIOSMOB_HH #define SCENARIOSMOB_HH class ScenarioSmob { private: /// The uniq id of this object type, only used by the guile internals static long tag; public: /// Register the smob to guile static void init (); //static SCM mark_obj (SCM smob); //static scm_sizet free_obj (SCM smob); //static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM set_current_scenario (SCM scenario_bind); static SCM make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects); static SCM ScenarioSmob::remove (SCM obj); }; #endif /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5355 Text-content-md5: 4fb5d356d48ba1aa9ec903b55102e805 Content-length: 5391 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 2830 Text-content-md5: 96303c7f6adb8c6fb434588638406b98 Content-length: 2830 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (bind-obj scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") (adv:define-object scenario1:door "Door" (closed #t)) (define-method use ((obj )) (cond ((not (closed obj)) (scenario:set-current game-scenario:outdoor-bind) (set! *current-scenario* game-scenario:outdoor-objects)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) ;; EOF ;; Node-path: trunk/prototype/helper.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1479 Text-content-md5: 8efbd43e00688f63217c14fec37f2867 Content-length: 1489 PROPS-END // $Id: helper.cc,v 1.1 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "helper.hh" AdventObj* scm2AdventObj (SCM smob) { AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); //GuileAdventObj* obj = dynamic_cast(advobj->obj); return advobj->obj; } GuileAdventObj* scm2GuileAdventObj (SCM smob) { std::cout << "bla: " << smob << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); std::cout << "1Pointer: " << advobj << std::endl; GuileAdventObj* obj = dynamic_cast(advobj->obj); std::cout << "2Pointer: " << obj << std::endl; assert (obj); return obj; } /* EOF */ Node-path: trunk/prototype/helper.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1103 Text-content-md5: 6af7f34dd5a7486302ab9405923e2185 Content-length: 1113 PROPS-END // $Id: helper.hh,v 1.1 2001/01/13 14:00:59 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef HELPER_HH #define HELPER_HH #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "AdventObj.hh" AdventObj* scm2AdventObj (SCM smob); GuileAdventObj* scm2GuileAdventObj (SCM smob); #endif /* EOF */ Revision-number: 22 Prop-content-length: 120 Content-length: 120 K 7 svn:log V 18 Two new scenarios K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-13T15:46:28.000000Z PROPS-END Node-path: trunk/prototype/configure.in Node-kind: file Node-action: change Text-content-length: 1578 Text-content-md5: 1b53ff3f4392421fcd8f57dadf57ce9c Content-length: 1578 AC_INIT( Advent.cc ) AM_CONFIG_HEADER( config.h ) PACKAGE=advent MAJOR_VERSION=0 MINOR_VERSION=0 PATCH_VERSION=1 VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} AC_DEFINE_UNQUOTED(MAJOR_VERSION, $MAJOR_VERSION) AC_DEFINE_UNQUOTED(MINOR_VERSION, $MINOR_VERSION) AC_DEFINE_UNQUOTED(PATCH_VERSION, $PATCH_VERSION) AC_DEFINE_UNQUOTED(VERSION_STRING, "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}") AM_INIT_AUTOMAKE( $PACKAGE, $VERSION ) AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL dnl Checking for libraries AC_CHECK_LIB(qthreads, main) AC_CHECK_LIB(guile, scm_boot_guile) AC_CHECK_HEADER(guile/gh.h) AC_CHECK_LIB( clanCore, main,, [ echo "ClanLib installed, but -lclanCore not found, run 'ldconfig' and try again," echo "if that doesn't help have a look at the file config.log and look into" echo "the FAQ." exit ]) AC_CHECK_LIB( clanJPEG, main,, [ echo "ClanLib is installed, but clanJPEG was not found. You probably" echo "forgot to compile clanJPEG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit ]) AC_CHECK_LIB( clanPNG, main,, [ echo "ClanLib is installed, but clanPNG was not found. You probably" echo "forgot to compile clanPNG, which is part of the ClanLib package" echo "or you need to run 'ldconfig'." echo "If you think you have everything correctly installed have a look at" echo "the file 'config.log' to see what went wrong" exit ]) AC_OUTPUT( Makefile ) Node-path: trunk/prototype/data/images/background6.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 48228 Text-content-md5: 7fbdeb2dcf4c23ebde87a131885437ff Content-length: 48238 PROPS-END JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"C!1AQ"aq#2BRbr$345C%S& ?EFj1-w"]DtmGOImזӢ ؄lm%l ys:Er;r}iBϥu$eRx23yԖh҆ix>W$5 V;؆FJ?HXHKɏ` ?\މn-E3#>8,?OXzBՆ çm@$ V`3z^rcV > g&Gŋ><|zW1₷ e7˃NR֬`<[ qz2|<޶X`zn9#ϻ]R׿cO$88 P@NOZCir_V&v t>^_[?D/'ZVPUv֣4ϚPTAird.yZk(*}?t>"/.֭U]9W|zVPTBi?z~BIyƲ۾_P?Y%5rI{c"'z '*VPR#+rA95Y&WnZj WZlw?Z°fǡ*&4hdG'CY*c|ެݮnOW0 *S gQՊ`$t)u`{g9U?|ޮu?2+m?zPRɜ68cXLU(YʷNQ4}g_=|U5AGof |Wyj꫸9((oh_e9#ނ?voaW `j~˿>jVPR9}fF7*PRF7*2{WcwksտU#޽Ƞ@[E#%: Iwz=P7`w_:YAG\c{׏9Uzj?{d~VPReլgkOY@W(#ڑuI\ 8&'IR'W5lE-ڈ8Vt]uwv' 63Au2?2MvzSF΃ZVFҵ[}KOT&DsoAW #cɚxya*Em5l{ PeeeeWeVd{YAW TحJAȌ2+"&-zL=hC)me±W$*`+hPR#+~@0> {@bc3;qsk+Rҵ)^pVVVPeeeepOǵ0pL/;D!da޷sKsTf@7?J ʹ_ =Wrѿg.3u_wQ|UԆҢ{Uz [ț֠)~R0H FsYLyRޱGm?(ʃ>k}j;q^3WPD>R)VK^`{Wzoփl wbւ[g sD%A#5-޲Wɬ`kf%Xn2k;dV+#4<6ǵL!y5!h7+ӶkУmY^m6mYZjfɠUӠ%smMGNJi*ڛqnY׵̅@g"iWg WC$NUbiqT,.Y<ѡHCc?RCXnؗޞjVI$(\BGMj&V &7[R}+RW~vjl2 (di[++; +(qyZYQ ++(2+++(2+++(595(y_*ߤh e5ѡ ֹ 2kp%8<z ׸H X-;MOޱbyjO [ R8*I;5YF$Zw+ 0P.NYa@PxDT84"H[nւ.(M`RKx.>lPzO{ZlSȯ Fp2x~*#g~"/WẄdZ?+Vko Km3YPkAxQdfx+PfEy{`WA"vs)h6v5Pr[O!XO5&:0*Fr |nRe6%3W|'ҁ/,z<~JVVYT[?'[nYc99X#<4znec1?CX-UN8i98D Z=j~ǻ98惹A  WVf^jGz0 #E"f2EB_-~ƛ) 2 m4 fp+W*h6)[᷌R84ZxŬCxS(7 {^mVVVPeeeeVVVPeeheE8,3[ {YAfc 9͢dV(5Yf &0jJ#>ME5qq5 [LfU m؟793EP8_&\1E` H2P 9ߩZH[,Yp +\[G'Zz J"?wZ㷁튌ʟZ*7?Z#utoP [ۍNړw8Օ@בm'k(_CtȉUNd\+5VVVPeejr|TB c8aX$SoYZ`|Aej[PeeeeVVVPeeeeVVVPeeeeVVVPeeeeԺ*5m<"$0)K㐇{ibt֜I~w.^2OLۤ^34ڌ09cXFz]N5cTlf]I)$ [=moݥ'c:JY q䚏N)HCV݄hZFrF}vA&UEW(arpj߈I{o1|ګKr4=(߫#۸*%*HĒ)`5r.뻫4ۅA]pr+++(!kXٷ޳W>jC+|+S*/ރ_ڽPIZĤB:l` k^vquek֚a˴ Ĭ"F0*'rg_.KO0I[4WϣP;Ѣ9\6 Oph.eMW"6sbEO^+qU7y`Y2c qA?u} k;i+݋An+ ÑM=IHԀoYAђRFSVd{D(չ (1ӴO,rka 5ไ8t1ҽ-(" Kt E?ↁ[,=1At.s JS,#bO֍,y'O՝b?=CoɻAhFc5Ƈ5ĠF9hK2^ {25dMK̪҂YK,$`pIDw+(6 יrY{AA-c$ rPle! fa֗WPEkonTTxj61(;Sc#HPpqb(~i@XH?Iq^-.d =%o onzwk$r~I:^W]N[dl\~{{ImŸ yV *p1*ygCrbҙ܍>qobDa- AϺҢT9rH'EE^GޭpiDFĞ~\٢TRG?n.34&[wJe#,]ejzUǮ,#ndz2F+MPE4R}+h}fiI 8duF=$ Q7v6o ?AAMԶ%5e-Fvc] VEV,bXPv+h?KNB\Asw0 0?2&<)dv;Ze ?GJƙ F.=#ޙ `׵,Q5εlcO$]>@ʾ^*gPRTH*#Ҽ6隼 I\I4hqK;Wdy o`TG!棓B(<z %%68֬/Yɘx5:l:>₶^Pu5"_߄,ӻ7֖JAmϷZgdg9$+Of9q&<qH .ք#?d{\惢i3-lEN8ȣ$cÀ>h.3)KBoV]~+_"ZR 0!ch>(ĽzURNG @.09xƣJ]d2KhO56R9єjlpNH~0PXJ>4[E~@&V4gJsӝ2*Iq; 5N雳+ǿ&C c$2<mȣ*FO&aBqNml#Wb0sZPi#!1vfh Am8#S`#R4D;ϐ=[փ:IUY)ɠ~! ǵ( G:bZdP9\gDŽ?ߪ=O 24߫?᭪0J~W$v|qA_>̷D*{!ʂx5Ta*_.Q{wq8V' ;{L%Ų1'}q[Yy O{m"3@ggEn,o"[u2Egֹޑujꑗ޼MJ>=OE>ޙ*|W%֯A&W$(9]W QӸq Wj;5 A"}*uئ3C ȸ# I`/{Hmb-&yHm}MFlKbV41UyMŹHPL`vEv]#?ڽP1EhTFZCM OAMZI1n JKEׇ 0.II!*׿492*?P0j'R HK[+} ό@Fe8@Wۏd/P " 'U٫ yktG5`tG.d%q1⮩KC&s,P-AO~8ٙzbxcG$/kvAr9ZVdm#9h\1<{%qKLBzU[y"F܆!A@pM#01V`T\ 8䷵Bl>e($AeA;?Hs^VjJ-4}2K4?ᲠdPm 1)\UX@9mI5c#{=/pˊim0(qY _G7`)`=۟AȥYcJ粊[|NAIaIf'ٖa > QUV V]ĂA>p],<`զ8Pe{%|"pU\AN6#Bg5@$d8UƗcr1$~EAu=)Zl?*[#ɡ2_`'q1槛@$w⃟$Ie2[i2L +Ǡ,XdK "g!C(c_7CWkm"H9Ps,$fApʫ*[/:z9[O78zހt(jFG0!f`{1h.E+⎷ҥGWq@j5Eʻka5 ;RޜsPL,n_(,mv=A4;]<-)$+Yye%HRɠW.:%=ވ#WWhK;)8+$2!*_LPs4bۏFSByvI85si (FFsK@#!y#ւuȎ"Q{Pc"9jWbGtYBp|`z_:T=ƧG%_GڝpՇXFL%?WPqzZ4qGڀ{wE$[5.9reFTqT5}JyHi܏PZ4٦me1֮ +o.ҖhPGoe;c1)[̍(?"ҁZn#ָq5Qܙrb'$WNֵ׏:j:Nm}2h+gX](M1ڥ%,mۏڃQu>} aqìΒ95:=Xh(Tcq afp<ZZ7)vByfL!X_Z3'8PQ<98()t{f3G֭r֗N::}/OFTF{ۍ c֥u8Yd2c,ڼ/$TQq갨[]yi:劈- |9ّ?Jl2e4MrH{zKn{x#v@UT0!}1$n*-m"ֵ ;E<mgl+/^\ƋnQ$V}qrkYbԡAg>(kx#+#ҰM VmʧKN-R&q$[;(Vxw7Bk50J y#\3^aC)Zay怛O\q?ÒP nmWjcՉcjPN26 2W&9yOͪ;8Rے҇Xb 'Zdؔ$@;[GwvБz bwSRVBa[g bef7IUvWoz'U_2Õ'ޙǯRA9̋ avlgUIXnHK, d3X~koSɁm۳02Mnڬ 2}M.T)Te9bR3,\on;$sG@%0kdxj] rz׹c7hI~HRA>nbO R)',WEqD$6x`|TRٚr v@P oԀ9ۚ5( @ZA##(q榅,f_N(d|-œr vUwdnIu5:[ŽVB}ZR<+Iu$i0'(E=mZI/kQ}EkU@wrp?ڀKgY2r8X#epG $> _X(;v&*av2I /R*i%HS՜ St.[ G2LݤYBUَ[>*6i"'Jyf@ښ͡mڱ82yFE {T6VwVRP@ K'ܳ HdSA4Ɍ"Գ[K)Vϟ+.Aj,HϥkoBJ8aN._jA#B@&vq@e7(۟zs}o5WVu8XnSi};&*rHӆF[H9D~]&or|Y6uq *nK֐4?)QJ+EFCr>o[o P0>ԽckDT*~3B]$ +s^-JOf/JOk'Ly/۹j-pf(?7s!QhXd)|1=h#ʹ1|WtRy\qtm*{ɥ 9Vn-yCmS겘R|>KSA#`A/~V2;x'"ww˩۴0.X㖲FڝHpNNkZ[Z<2EDN*1dv@|)vGS/䴝"QЭ8rd )6O9$7Z%qEj%h_Nm;EFy;Md7]D1iFĤn$QꦁuC0>vmќl[1p⽋%"3[dV8q8Z!n!H =M{i`2rTi^vOh# ۶KI8=.4.@?;#QAA@V.84 14"k'PM8n8(N*ClzϚ"$*< j%iKSKHԩ_>[In\)h`CҀ&MNE[_]˹gnHzQ6ȭ,c9*VFwK!ñ>g;wZ:>d~ }igI^#XOӤ[y r9n:>yD[_9b RW3>a7*DI HSMW#ěqɫK&*rj0}PO WU4~8 9P YOzUJ㍮"y5ʏ8jVh.,hfGM8?Z5pn<\m{+-;I%IJHC^j/mZ)$tգXm!!pԆ5[rBS~鋝+V?JpZ"և6Prp:HàZhb h)7q( .|xLP2.zmVQR2r늴jUc)`Rin̍pH*X[H[!<D4rB$LZ[[sx[6XԹsQEzdT c!b(;QD>BB1ǏJ:KO{{q)%ȃ jiۚ96҂z61*I*xdN戞9 M xֲmB EEyP-P3y@8X UC*x"Xn3AN&ތh4FsWX84dE7HO8AB8*2|qQ26⺁t;*r>hQFF*+Vc-pȹX6fU|q^KZȡE<:-rTd[Fmr1Bm&e^Rq'јn⃟ˢ]vr]\f 3ڸ ;O4P 4oWՙ2>)Ɵ>lK}arsIm;k @N9L-P}UfӚvTcП5SEP( |h:+ms`R;lF4nJ功[ͪ\U&3qtί8Pzb-5m}#nu}$S%ƒ\W(iBK"F*XnlN8!y?LpA4zp\.{. /hȪE QZ~L10ΗWjr])dCMhe-eL#Tc#862 } >\5Kt-,'v m2R$`79P" 4<͟5խ espGx̲=+T{x&E9 _JW\rA2w7ǜzeV.q}(f4&f Q].Ș犎NZ\rh-Wr"y^@ XB2j"fՏ) sFc` j:CJ89MZ z&K$`1KM(:] &!JL01U>]:[!ANfajrOl#OPMHnNA>*,]& [\0P}(:MiUϨOģU۹F~9淇Kx.[#<((fyNXmGO]lXL4 2g#֩6oiZ'V4~ ڊ2 TP&~'>Բ-OOw\,MXtiLߙ}R%!f5F 6$(U3gxh\"Tae^ο<X/O`ҴwdTn 8\ujAP 3R@sj?hR1ӢUI[L1-L[ǺB"51 5{iCzS#RILS lm+:op|ײZ@U b9=?(WrFpމ[;FT3>䄼!G Y;1I$>*9K '`>ˣ SQj_.ە5$qʲPAA:pHSv2tjjߤ| ne%Y+B˻ha(NnCb J_PN 8#J ⷃWC,vUKȽީzjI>1] .0"C> uDRN|Vj.lC#$Zm1 MqNQƫi #gրS O}YagcRf#H3!&!VK/zqUìTFp‚Q.I^G>?Jt\rWQ,[&pG47LMn#Tgւ]NE I5z}Z; #ҹ2Iq+(sW;cXn_ HIQ<p7 AP A?X6СHhe1E*m2^vyaU)/ Pg&Qnۆڼ]*bpH.q↴H@VY6ZܻWw>ֶ-$ -L1 H_ h78[鿭,F3^?cVw~xd-vɠg7/2H7}"KTlaMzWk7RT|C3&^t|`sӤz)-oجytk!E,“BY(qAq9-qj;k;uS/xqqK:w]F9E{Fq^cXa6?N(+'11(tФm̌;U䳎6]ֹl)9K`ncR0 sA\Yg-#ݱVޛ#$Mǃƙb4'' xEv?cGMsnHA8aj% ٛ#Ѩ+W;NTsQ ʹ#pmrU;cRk@Kd4$1 F IObǚH{ }h|esm6`3NX0 <Ne\\&[XĄG<׉jLZ4bHRpx[㜂(*A TP4lJ`EX:`\[d Kq]12ȡ@ D ?q($uPe0:*`9a->ԕ/6ӫLߺF4z+BE?Iͺ/S!۹l`b3Aɮmʹc#m.DU`3DjVFV-TM']RQBI =i/FӵqmNMgs x,a$0AN}XY商џi%ŵsb?4QIkXT {K5hNB#/v<6i|P) kK5Xj-C$ᡙFFN)tJ z١n0eH.H&Xۇ,׫Yє)d:ͅݺHn#5U#!<U儂U⃤\Kn# yAc5˴mÅ2Z*8w^\Aju9$oDcq'-1Mcxr)R4>)^Iԟ4҃>NP2^@]wfBp<~>q)hB ̚l99lީ CL9}u:[h&Sn:GCsAt8 ,|31|kC)֓rB[ޙ͡.i+oUdqfnFR ֩4ڌO>8$>()M(.Y?J~S_F ՏhUk=xp?Ag mi_-4n!>TNzaз.yoOCʦ> u@ $J$V+ϠD%b"/Fj6dp3Q4ّ I:~ 5д eqgs[jzlOWVWРКGۻhRCb;kXjfm@xNHU }(l(t +[] ^Db$\p3F]J@tbqjxeQuEeǯré;]nXy:,` 4FY[3H 8'^r+A[06ǰFӰI-SEAfs@Ojqk*3xtc=9(mlЎMOڅƝm)5m=ySzރ!tŎ5]"=:+0O3ſUWr1vPtRscv7ӊuN><@'wZnސ ]#wϚ)z[x29a ncK;nS:!;Yٴmcxn Ę|޴MeV9glW12HوxW:XYq [ڀ}Z&p\_&RbI␾ U 6}*xt'=A h|T9ۋ ʅulDHN 5A!: vo]=,rEU-B868R[N5yʇp/=eq{v֒3_:"FoIB@rE15Ԛw"T :\-]=< q~d9C+l_֓]]8(X5nҙU/k5a&J3`p6恇\[vmUo,}(BmMm&cC豺"XF !򟰡[ځn$s֣Ѥiw5P+su|GAgB@ϮL>JNInt;1t%TߕZMf0۪hF B> BI^ m`==3.nΝo'k(Qy1J㥾&=NG,zX[1m^I5G>h8͕Ν 3DsI/及Ze7rs#L惺Ζ4ҔjmA_^lsޡ۳ߏ0xגNp@XYn!y4ݤL$`|;q\?zNXC~:"08t J]* uKV'ɭ\XՎsQuf:z}Q1~-:mցkXXpֺө'#> FS [ޞwF_ O淍~UfGGJU"ubp#9>OPj]yk;h~U0{+Qlmj/o&֡ݧ׺º a|5nh{A}-C}ie&x*9 CtOO=3V) ~Pdq(U?V \[$TVZKmjX9v((h qpqH㲠3Eu#XFIjG#X+~wS,8}gpVʄW̺]Iqxs}>f3@g.!4̑tPɨڝ2&X wq5'a$1սPKuɠ}H"BW#7)}E5ʶ+}7񶺺gl'h>^[H~5m׭`HX}:H[QOSFE/r C}>(tŧnT]:MjĐԱ0; ֭(c0yO4H"p=rhh~ e-c>(,JƢ[ `gn8[m3|f\.rsLd[,Xu|P{->ƗN;(mFCn-ԡ~1Mv$>J[#7Pķ=XZ-bTYI 6@^][w#F-dTOgs .@4 {=f{'a51J+Hl]1x9&.A6;3@$G]qFY;ܙ%>֡H+?._A IJm \Q*4< 8xC@$q9t9ǽ{u ~~fM#ҁ .2ȘxCzRY.(RF8mY-A|e؀?V}hR@9WA}25`<ݺt1̏@+u#*6űF[:jI-d>B|d Y3;< iGmF2ixc dP2Y4e4 .,b^Z <%cvzx*fcZ~lOmBaG-4Ja.6dvUnzJp@=.taR1[deЯ‚}NR3} H9thX9WP=(.F|"q1:4jc򌏭` R /th ѱfsJnty~SWfs$Ts_Ԯ^!?IAOiJ?ғt7:P18oS+Ŵ#sgs/Y@!TyW }f#>W3IvxmLƖ[[:iiUkLWqC^[& (.7ۗrTp*gJB vMGjnd2Zd)dGoH( ᱈$kϩ5LWp1<~q5bXoOŔmpHP bKi0GZ01?Y::,A9,9AsU=F,G-Ak2Ke@|c5c4Ϗ&Y `s?ʟ(.vzVkrXm<>{KgOs/E]Xր׮.%{]6FPqr íugm6L ##M+_A8ar8j蚔sI)F\rkkV1k42e>PjE!A=MwS=Ӟ{n I3qq^K6h* -Y#Ffv9a槷& m p*Bco2Jn8V#oTic"G˸zI# S$L2}j c<)4 Ia^cf H+Ԙ6O'cTQ&[ P9hU |%$e`>чkȯnT= QEqy4RgH9yml.tnjE_[*}1LtXT"L9F#Ԯ@De|V ;I+@L,ԇ2zPyi kK(=jK@$y8e$X䓀}*Kᔸ#G Wjrcϥ39 7놙Hn0o4b39]>;A72=g0 0҃d!,sD]ϳOvI MVerѱv [SݠBz ^ao,ޭFÂI惟>^cHw,=sWhD'Q4FXE/'Ͻ/k01I]()SP])e7S qAtm;rOE }ǽHmͪ1кtefcnD ڙN[H$ַh`<JN?''PR:X7nDu.+].; sT;"8ʗ<AbWN+v]>doz؛&as$']1[n&FhW LYl= =qK1ZW`' @FUF8Ul>ԵEhyO5~*v9yi{9cUŅU@yt俋{P?Wҁ/K1VwP*N<0zt' kPq|̭h:E6sA?Wjo4PX/3s p &$t0EE>&5,pӏ5:z)  Q{]*c)4/AKNxMz<̗v7zqMzXmF[c'ךj i N8g1My.+mZ{C 6ˇnN7Zs:j]tcdqK%sV9n/o2&=7iw%ȃ Xyt[Oq+N^Ν s&MZ%mC4A FݿOxaq8[]_^fpܱ4} .'(Ќ+n0)Kkgip1 bG}er>%tMNng[+odqJ Nfۄ SicxN,>,7| ͕{|>Tk*$1ǀ}(YBB(PU~PT\˿89fŠ$9qMt um#U>šK7-iI>UP\RLKk7n4bݏ'T9u-fUWE' Yb'9 deA<.YC 42Y缶˵9\32 Trڒ^ЏyȜ j膙v} 8FK+N(IBcz[4墊=cXC-u:m2%E՘m5Ŕqֵ,A >=ֱU[H &|e@.:ze鏵%PSuZna$cYI]m)Hiݷ kGyb32|R5v wj7z>H Z.R̄w0hk:$$ɧ=/vp\rj\܏{L* zQ%ȼ(OPX3IDF!*[ӊT^ȅ>VPVMe &Xy(].j7] űǚKIeZ7 {Tvx" sSZ[Ji4P\@>w?tVոUBT]r'+c1D&wh 6ŒXd5 6ý0}F}kYǕϚ ݔ1pp2hԂ~Crwj Zܫ6IS@)QP.KvxڝTʌg.xhc,sr{r+!2 X7;TsA%P2>Җ16H@;4o1N҂smi'qڄ7bjd 1J[>}M}MrsFKޑ’\3$%)Ucy!.[i% 3Ե ZIv$s uk=nEҍ)27?#H.mKցVjĒJ-՞Fұ*6)ݍrW' 5צL?4 mդ(hs5 6c_#]6+k7hD$kiImwBQ(.\YFi/Mê5sHX扈%1}*>M `g[+y~olgUOzc:HR( *qh>F4?h2ȃq<9S5;6M^]ǁ31ƱGOMw"PhrO4۸ch"ݳBcriWL\Lڄh9I5?(T:I@9$} W)oo cHbpÑj ̑#1黰#; F~ؤ82X(#E9] c?)W<ՇZ5:d l&M73J RPUsnb,П'Or9:!2 T,bL? Rw Tdmڀ+w{֍gK$tm +p O`l"eaq\CT ~& H8SLnY-c13y=;_[R 9R;HZp6Cҕ7"ID7L&ր3 cS{l`daW?BP V-w,@ CMY"s!sZ-pz|ǃ@@1&U_9T?hqb95bD0'h^ʌQ@'ΡїVk>j$K&25^Ec qg4P)]1(W7w QA6]U#y@Nm}M+M q*k8dJDE Æ7j{g҈VձsUΒXֵb5[Q$+(oj*걝+ĵL (InlB+#v_a#OG(2,a]PnEqs@kDH4[df9cQg @U I3\IH8XKqZwSO@c9cږ]*kf4~N[8E oeD<0y4X"Ď{52i\7>fFBx(ydˎ|Prޡ;J eZa=3H:j݂I:ujwjUNkwWuMp| t?jB3pJyjh3l!$7Nhutv6[beQU}QmԤ yaPZ䳆PٿQ<ѮPA b)Đt eQv˴GUG(BK oI-cSV-:/uTr#X$%u㕶38dREa`j`-l4<7Ӭq(r=(`Yb(9 E 1'ͷ@޵1GDX`UShci"UUch.IIa_JxEP۔S3s=KmY@2| 9D D;C$pe,[=+NUڂHlzɼ'{9y (2GHmB>j(;^PϵUaK36ݿˊ*בj )4y>qPBrL{`Vpcp"tEf<"ӷ1#H1qV;JEmyf>-0iO#_tI]}C U2 fnpVڧh&I|P=.&mɡ߀ 䈔Iu6Y\F["(%|c5 sAк YO13O'd"銧t3RyeͿ#Ps#s$PIY4noC,qhrYMk]HcQƼxGk(D+N( yBԖ9zK3I@p~ j@W'w:V)'6ƓZ`[i$5cfjT[u}R4~K%ª d}j]*q{a ֤1鬀a_E,uñ8޹r,A,͆ڭ: O Q]}ѵti|O>[PFA=k˭A[f]r6r}IjK|gރh:pQ4E0L3"Up:Пb׮ g?Vw#3Lwɤ;s%"i6:$-Bi.Jc>ݤmVWo L`Zki&sLa8P?zׯr\*svkT Uk݆ =3\ U8f$Gڂ?BVw5ϕw7'&?C=ÒO4gI _"Skꠢtmv'9ITZY`NmWԬRo z3CӐ(4ԭ195c$,@+x2Z#d(*b3\ n:&\Fkki.lW4KfL{ǧe \ cAkOr(Qi%v$ H{;B@]2EgvWׯܞ*igtT$P>]怭:Yq3c#XUa*j4IVYZo!VB=OM{%*56pv~'>j\4'_m/l<#JZ>䌰yl[nqbOJ{emfF@]K$;yCJ 73 +l ) @ 2+c ՞GCNB ;[â0`[*7޵%ĘQA_!ڑކY{zy2 &E`# ~'q@4R}I=h]^[. i40CLAI1ꝪOupǜJ Pjz%7b'}bCҝ/b d҅5;k|*dyjz_Ue 3R"\.ֱ]MDK; I 4MTԂY$fUۻҥ\vۓ@笮N _j:2P+~vGugqZ,׳[<8܈W;@۸dQc?AH |Woj!v#bbtf;1⽃R7g331.=@\$PU1-%YLk%ۜ}8sq+@3 uh"l@GѦUqo,ex2@Sj!33>xZX!)&ݬ T_iAT֨=AI$ʿ0DiݖVAn#\}f1Mi3ZnI.TN?Lua"["0֒v눠v{,~X5ݮOU~;2Au"9Sy;5+ "NG wnMtk?k8;@PvE\kNEi@Qڂ32 ;&e]N~Y5Ls0| xaێN=jH:pc\פzD~ @Fr$94bH2AP]c8**ifmplV#_Mi˭ٜx$qAt-J5?9-7 @Izд918?N5۬!$plf)np5ms 27[(b15:D3%K%>m*촑Y(֑jrv\N#+HxA]y5MԢ rF>lb)^5ՑbVT);w#at.Xc}jt rEz˫]3wOLsWۏӺhЇ sd(. #>pi=B 7|&PDU'*}s[M3 g*[<;#S;wif8:4(o5Ew.s"UƮM1iR4I' s $~XY 9Mw+mb(B[ 0HFNc ۹VcqAVKӈf?LQyFAMt[{F{m-Xڼh)V7m\jz쥤v Y;S+K ch+quf'hLXA| D򻝲FrZibWeYO;WҁT_{k[%tup6L]X2%6uh,u_dU`S݀}¹o~P(5=9r8h/v᙮#'85-mvq\T3Z9SOn X (; w1%PJ9W6=OskVB ԉ׃f;3 A/)=żu`~\W4nefs^ekQs${]jG9,uysrikϩw Xau6rɻ4g}E 񍆇UU-x#0-nZ4R u-xcos 7,p>]~VO((Ct$J*F}fc;}M_%hF1\,c.x3[ow l0c/{#b^8N=Igv K3jǹ1 .a6Xlhȥ11q87F,<"F0 \bM Tk%IRHVڗYٷgR<6x6KyI1:HǭthmK$ 6Ep W}>R 7z?PۄF7 O4¬fFN6G4sm$^~ZHWe>nnnxm&I~KyΠTpq⤵pV`&[m'O[ ע~R!L`RXd 1$ޞK3 !_j1CQE$FI+ N@ȫYZPh=sBϪ3^$i!D}mwϥ/Һ`9 kUqCsAv݈3 %(->W$!#.YF4:VI޸_w$F鞵 s!x?j?6g\ -ʬ6YzQuslଈ"|$3 ~ՐnQLck;"Ҡ˦cֲ9f<EyKܺ t-aO E{[[Dǭ73YM~r\ % B="]X(93ӭn5{Pe(n׊ ,Lu 4 d}Cg;ۅ_9.[ʮ i,]V TzTVmP1?nY SK[z3}$dU!1n%a&""zȮ#0 VΑmdFJA-ۼN=(sp zSF;lYNVFPPs3EShi%P@A#3كPhZhK#i4>p)i FIb7 (pȽ=hTn9XEmwzf9U*os[Dv=Pd3̾Ƙ-嚅AkCwBݒDx+o @Al}*`l!>}*(2?NER)1#He̸3 Dbly#kԗh)6QxLwdPEug3ݙ[n01Cπ8>Oԭwtr{Qc(d QQ NF|kg,@o*️z 12[6N -ΛddgާL'$k֞jW0OL8l?;tm9ʭv_JF%e;hC?r xA@GwBשv|)q>X@1+4YV(ҕ V!{gڬVu̽(GӭҤ5 ׾ F spAm КwaPW8`H Re w"l-mm&M Ǧ(u})L͓*rN=BmR7Oq,R$ 8oJI96 iPp3Kp23D4*T mp# YԑHyQH đF3RI #^@鴨FԫeUѨwNG8l flch*,ECw1&/>(vi3c;* QgYu%zh>kEJ% ZVS.jfg0p,6Nfb 4NA0whSJNiE%6&\o_r+TT=wdxC>au8C"R|0˵efemAݶMM&9Oo<-0vl`[dyI;Y p3Qksr p9-CNMoǺ$ֶşqP]\+Z&ID8Q݆r󷸨.f!x"umzK1`ބPDEe9DVɂXkɡmҫ9 PA2YX!}ǥ?}i!|k@6y #Ԍq\wI@;c֣gpYvj']8{9}7mB(FE sp y_?Z)%r%Uy-['xe1r0|V!0c̆8FsE\zPyr.WQhqv*vK(Y{F@ͩα'o$ }L…%c#<7=EZ# +74PH sA+k\Vc r(_fGEmC nRPCu;r jeӺz"D6m Psѧp>H< *9=.ߓS9XP4j9Z檦TH-(:,5g_&[b1T=iWbFQ7!%PE[Ko@'H/w'hV )[B凥D m-\ N1Lk"T(-{` } xp{[)˸UyҶy4UڀK?)pQ ZH\aW5whqfӷhGO4ƒ'#sX+`WZ8j:mT*N8 >ۙ =i=&]nY( 9,}N%r@裢$܎>zN% =^텔zAtXs=wAy rh +S6hϞkjLݢy]mI4rHG{A ˴3LPa)My!dY}*im_")O\i0$F-9c%(<*!6ȊHY[s\L-7wڰq榏' VH,keӃ^-wr4]m-Z۸jH`t ZGxI5-RAk0xj/0x&ڰw2E[0_ }蒶dw6g?Z7 ompJyYά2FpMy.L` Ǩn_S/}8qX-DA-B\Ao%V(9AIr̬I5cq)1[-XS[fǏ4lf>^;@ۉ7aًruO 6oqg WZlj+k?D`pqNn[9Yʾ9?-Ѷz; F9r9#(<§Jǵe^9IVynb.9ǚF7w+qC5.KԺ=:{A,Ѻ[( x$fy;dsd2mI5^հQ0F&4Pǽ&kP77ɠYXܫf:%А M.?>ޕ F~|am͒O9#X_NjS,9VĤB>xl6=q-v9;2+(BިQj[1f^(9Qivqۗ䟟Mg}}rb%1F[j$VsrxZVwK?zH}#EXdqp9 8NRjЯBsѤp ]קu64,82Ki BOZ^6xѬ'lex:+<&>Loi \9pC#g&Aj@WNhe378W(dkqunKs.yx-M">HȠn+!c;d!BXK;ےɜM'Ç9l*NXz.ʹ9Ed`Z6y$ 3V37R︀ښY5n_ Wmra{\KzvsF*I(isCXDҗ_+-7[P "[xPdF4{wTGg_ARQ}hD +)4|PpqSPѧ,lNˁ5Y-͸&Epj1l'SCdWh,sK`{H0(8a|6R ;(uYk5*,3<;|1S|2Zd ڽ@0MIml8bc0W{'dG[ެA-u E{h 3VUTy#M .כdwP]eˊilgR8v^HÀx40HI)_ +|W(b hH g3|ǐ3v\=080R͞sA ĜpOm-H* >Pd/` ֙BCpn9$gZPϵb <+u,c\1"4wpqA \HC9J;HkS$hhf/֧MTi _j[=q|W糕 n1Ad[M,Imdaj{4Ѥ@cSI?R7 SBuu4z(U 5X!Lx-#qZC:vc[8~}5Ʌgr*-?MS8637J@t*#$ Ɗ>:ץV hT'Pa3L{qq " n @Z}k&=E1t6ۊsAT"gv} QBUo~+][%d#$vP vQYN?yĘ2dJGjvlriK~޲*1@,cQZLe8bT̑̃x> ^&CJj XNEʖș\*h#\PXHUB3QltWmkN/yPB28f#uTMr?!r&[f*պd2A=a,,pؠŨY2~e('4j^Y&?zru͊ƠHY$`~$_ y;2@GsK+*8#ִb$+BN8|0v@A>qq⁰rq54kj`C\AiY;5jGyEQ}VVeJWjqTA'QqYG*E.X1>oz6gQ(j *wG5F̒cC*[fQXR'~ SbWМQ1벬nҊI-ȹ?ڥk82|ؠm5X>ƇK"A<яZB%b}j~d\aGl$!62H݆d P.&ʹ,x @WDH>*``R)t 7tLTYB 9'3XM&D&s[#dLؾEN< /mnz+VEȦd'vwhdzU'u:j8{ GM7TX#3Nz[XҴF3Eݐ1j&sEy|GI)FiVzDǞh::Ba")@lB:CHe?Wkav 39Ndyc*KJl6O4?2} \܆'@nTyzPv֡Ycp)w e0\pEQ*߁52F" -Pt)^#a$* }(zu_ Q چfe#j^wB$TV$9a(+zmnysj̪x(AXl^D# >mcUEiS]waO}+FR)>|!".(9k}D2`ԟ@=tF Agl`Ps]yc EkCg\Ycb1]f$یa2Ȁ惘Hj8)9me']I8X\QaS Ps[oëDŽL_:ؓ@0h9ޟjAs} *cAB^ᶲv۴h.">Hd&ll#w NjSpPr~sⵖq C,ߊ4khCIZEtS/ q(j"SUj3抿19,%bgo[ʌa{WjqMYn * c;Kf AϽsSӷ$oPp0kxF3àe TqkcS `}kh%ac'/1 $R\>kNz %kĂޤKBKy4{pd3ᇀ*G#]bp=ɭXUl0Ab#;]` N@W$U["e_s )#ha:oX< &imjU5 `"b8/s4+H>٪HzՒE$LfU F|㊴I8%eǥeU;9ϽhТeZ#5pA$!^#Y /Xʃ'y%"CAF!O"9pG d<1esUSxo$YBVm1sEUדNr<fs]g%J,Tmz Pl֨RDqSB > -@$+Im.{j; DS5L(L@lɟQ^k$E(y]~lZ|ܒ[N7K1e>3QH( xNq>9`86< MB8J>pdsKn+ 29&!DG?J$@עNq3*U+I  ޹Pzn`_,-{5L6;If'ϵn$QgYl9(@0GIH^g),p}i.{S,f€6ܻB}*?{1G5sS(˵cr} BPjɜ$*N(Q5h"Tn#OF>aG M.߶{P. 2Q`Pl'*oR(7XTgPB13Pع>+qg0u8_7v_J\]$yK09?Z!4qUKTTrYy4?ͻgU"픪Ɯ tPTi"B*!b]%xWAmA H-4e @0|nM-KNJ?n]Tz_M Y!JDn}},t[bbB5q+P)$z?#Z4AJ) !VHBF޵sP3q^LP 5%wyAԒv`)?Fc@r=7RiVWQ9;3QWh犟1x6^=8%ϵ[-#fJ*9Q"\sIqdڤZf*V@# sAIW[4*NG4qY"O ɁA,w bp2,#Q;C)Hځd7 JWA{ѱlh#O0Mrk%J-^Y{|v9lJkض^IO(!)UX[ފ"#DȨ㸳eRNe jʼ~ۍ8FVEb`[vOȠ)LߊSvЭ#;h&iʒY wAZN2I> x4.h$!g8U>A4AHA6M@ƣdT`9+~fb20,Nx Node-path: trunk/prototype/data/images/background6_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2539 Text-content-md5: f8adfaf9052cf466ead2de335c4fbaf1 Content-length: 2549 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~bKGDH oFFsuG pHYs  ~tIME ;LIDATx։]J)EJQKBQBRJvE vB(Jm9s̓1?pϹw6ZQ1zJT dj5M#@oMߗ U=ܒk3HsnnN ~ SIT KqtaSKsSرcu_ Uw wpJJ>& U.gG{Xm2HisSp72H:}m%@Θwpդ~+H9Aጰtof*Rs3xw3!HY v\S'@Ht7H'@:%u9 +D8h(* E>>>Vw= ypet''>'@V P5WbB|*LVn{40t X%ƕ9 J,f77F}FOookt X%@>pqg(A~8nvmfXtLW/3H~Xmo1(_rCfX%@V9 +;MᶷI`%~~ wkm/1(߅GǕn{$@V PE7ScC!LVk `{vӜ?1Ls<R%@n Әn,"@n^nl92Q3_氚tbJ*0 q,sXIENDB` Node-path: trunk/prototype/data/images/background7.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 40854 Text-content-md5: dd0648342644cb87466338bb639b26d9 Content-length: 40864 PROPS-END JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"C!1AQ"a2q#BR3b$Cr%4S5Dc ?fby#Рmmd.ޭs3Fb/vIr6ۥnܱF R+h2wH݁Q6;+p SkTE8iTSI` eXjb6JϚ_Y4>@4dQӾ´Bd4ܘi ޶I.4I* j 6gڂQ'=(Tcv P-]l{Mm.6ԽM&k!ƅxuߵ <=7\YVq\D\ǽ:?:fPߥbbf'Q JX$`4B.H§ m"/ =lN>ita Vo{"^3&IQP2j g Tҧ$ Y@Ґ@Qr%$dM8#I-oUq#eC y48h1of+WGm&nM!eQ*`|{#h}JLv9^88"(D=&T db7zgd`f>kmD{H7,P[+ eQ/V4Lr(9%h9ytSE˶ k4!$9ZYaց{hl҉X MQ27rpI9R0@c*v4͉?VH1Pma*Ml6=ѱjx}XC*?WaSX8ϐv ? kWo։z;Pu$Vm!)߽C#sAmc8fj2nƃl]ˉ[*AzPzV*T*T3QfA4 LeGSZT( MlnTVڱ%FCV+dLFNEZ.HE24s L~X`,#I$' ZRX$׮!\4:6;֤dbWꔧ'K"B CX"g%NRH8ڏH #(,Q5*z ,ɥZ-֧},^Tn";9y Ԛ[dfNJ_*BcVq ; J˃/yl3h-V"%*{5Ff*-޵\c',j6ehtB*"HdfcD21y 啺j`䟻Z)$A{g- c$B&:R';J1L m1@+snPRƃI"e5 52E/4jE;bHuvOTݝǏL`'Q8?I0:4 wݚMJiBm 1J-,hAcQq&i$HN ])[IC. +aS>EvA$' $!06"ц+JDCSF;dqҀIF34׃HYзindc*4S8ڃP X]X>~k~e8m8#|RpV|6ui^va8[,i H4Zdy04_w#f$sc{'1V0 n-ǥsfS ,nF)v:ΐsZ灌bw'17X^դTt*&h)).hkI;~*'QB5QK.PmПi@$]v]1=Il䀗#E:oYT[ʟqfbsҠQz "ζ$+V(2N՘M>5r\ڨ198!ݜ޲Q~~k$ wڽZ5RgAjf ۺ&D?zbBAJ#RIu5B 'V?z]sy-E!B( E'+&2[pHƐhk2 D96C&qZ|(K&_!˜`fIH@cmhmLs`soS nI4IʮeM hLTsl橙5Ӎr(*/LWr^qduޥcڭڃJ*PJ*PJ*PJ*P|Œ)&MKlƱiJ٬&vrQ 6{Ԟ\:}[F0fҵYV ]D;5v% 1:EIo!Z_7퐺ؠumÚWF3*{-uK-LU #BBm^h1C1m@޶[5NH@UQ>.YWQslb@:?41BGsJ̹#[etbxF&՚Ijk94Nj>i61NKdo>Cu 9j㍫ !N.IWITzo$ qk1p1AqH&܊ߖт (~ؘr}E oAkVh 5ż sT( R{@Q`i'z .]9~q֊]#0{0 dQj%ЅcOZulCwM핣J[ V` wj:ܔEc) ʐ̚J+5Ҽ4㰦{'@j-# "G)ޏHV0@CB{7XD/H՝ 29Pg t8X5ET3GPs,b%vuyLvt/m8c0bw=<䫸GjV! y'$SV 4GSg-Uy'iqǚ 1D'o1˭\P" ވ\dXm@Ng1XF$U`6-\68ȠݓNK \ש`e›Y 8Hv=|VɠŬ-Yh̙"z#!Ȥn6{rʪ6жּ߰P '1:(jj~ pp{wA`lleF ^L^@KtΡ J3 yT bq,31) S}52 0ȡ[;Ƹ=E9b dnfOjxE-lJ*1@%sSĪ[GU3vDIމ8ߚxԯu.aj9cznF u+#oU殭%@A#U\V-<(ŰCA"kȬNPJfv8P>7Y}_(sg@`n^[ֆ:\P]@UA!^4vPrX;MXmB$0tA dPd@y 5b!7X\} FͿ̜|U㩫^i<0.X.6ߤAhsXs=*0.{@Qpj,El vЦ$\;;#GpR@ERPhTaB9LhKX2Kޭ"X,3i^.;LѤ݆Fⱜkl皸zu2yΡ bxݥ\1 sR c_4%Fǭ mTb,"Ǹx[d] *`j)Eo3wa@qc>@Grk,s LčDt.oURYA;P2* ?溚ԒM閒Q725PyxW(**T*T*T+ڔ^ԩA++ڔп*hO[1A] # H{ yOnG-WzPgU?Ҧh(bSPF_"A@jhli*i{RWEhs{AACWPw+#9b#dkz^{"6+Pýxr…FLTFcux Z .Gj[@ڼ~ltҵIR+Mskt~)UUѲGjUzuxBc"CcIWu5Fu^lh+zX;g;DЫ'w$ϵVY„,[=,z1KȶW&bfbivQps@dU<Fg*oZ1z<׺9NqՅK% m ;}@-ג恤Ft;v@On {+SKPA%R7ر[DJ"ޮKyXUR"%m@uB71&v2mQXYhdl7Aj*PdPp4ߺKTSy(F6ZO  ł+[V[&j̋vR>xPG#~jŬ܂zc`ujAFF@LO$ .u;iچkF'V)}+t ܼ Y8X]Z>Pkn> ,S7JW{Lr>kH7_uv) g4{2e2;33^-ѕ cdhegC|P-ܺ$8}#V}=NT$Q@d&ެʼnL)@p KbNe$#HWcoCqć륯pWdm1e:vOe>t c;Pt+o Pc|0qAJ(%J(%y{RTS4JJ*T*T*T0*T^ 52hX [J&Ewq]V2jֵX Vȍ~h$c,Z#lcbwPiͬ[@s!Yɕ!|tciw))R:y )NYvEk%Ln)R,r#ZDg2h[0VkY]$+3two ̎5Fv@**p K cm1ĀqT ްٝN:P3,^Г̂CR.SY%wR'lg&к!>7noYa5"" [a`S Y4#{ [Puyjx"vw>(9j/:iU]Ƹ\HFF޹6 t:c9EpgW擩ph6E1:;Ҵ0*;ZUq)EڨX20 3=ZczuȦ}>j6_2hHmeJ,p=Yae`6<枣Aloih9;N-J$g)8"GbTVWn|(^踐{2?VےՏ]y}=c4lUI)Ǣ}^ =_%kbi~ӌV>1l`w-փk>VXT%4:oփ4$F'@GbkK׷ͭ` s7S_fԭ}^7c'4;zHE9Cᶺ)i]uM :q9\ k2Ru.Γ]= ߩF想):8*{+*ȁ ƣL@Ƞ2+qrIydQzyͳ<״A"bqle>( X2} HVrfjPj(+c4VA(Uum^z Xk-U1E$ ɠЬT|:ysסڭRq8BTuN3A%hZ2:zxrq8m탒p]>rw % 쫤3@놩H v #L2JleEaV;NNz)@'FoEQ% Q~ G(!f'4<^) /k ?[N54:CmH֑I =rɴb{p&,bpwP:j';z4iRzE/a` pphI.[Vp9N ;2zS#˜m667bRƣܤsog[vԫ('876s.0ZIl8`P13> DQ uģ%hR1SU2ځdѴ~B;ҶnN1 wttUb; c4W63ǚ[̍Ax%Q67xmg23ҀźgÌh'UF 4B"i zȱ|d6zP6ncVO#F3׷JQ.."|"3];RJf#5GۛHte l. 'KvK|D&Ү:#GG (rXm&$褉$mAxIp2k[HđfWbH83. iA,H=M 9utoY*)hG =OP Sh @X7YȻI4Ec1"bzҞ-xI`%TBr{‫Hv|WhVbQ5dK{vZH[sʰ ʚ\Թb%H㍷#U\6 PEbIzi̓thuGf &7 VC҇f@3` [Ƭ5M4J&UWsr?ޗaY6Sw~w&>"0ҷ,Jb4V E{ux!]AʿOV:g.Jaux# }hwIڃi.n$m 刣d ~h9e굶A;(b23Ay.8T,*FV.T}՚M{t [wG\rװ>H(K4@'{V6A$hڂDʍk0;nw,4gHCL1m&3չ*;.$eU;Qp''Qnh n߈;D5 Xondt[8_ٓ8.vA!!xբIJS f so'2iK 14nX1y%b+EPʥU Ynrq|4kVٵ1gՐs^ >ߊ "C+in-ˍ $QҼd;blx2Fb(d vsVKna߄Y(B(Ui$] όUV1Ԕ9]UA(|Q?ꐪP Rd95EGL'/HEIK?ӸL1:q惂7[N^4ir41%e-=]"]r:?I!gq'9v-Up>h+.]JaHdla@HImVXX;H- ͮw= RnhU17ixFb~o/g7$itE} I;PC(8M] H֍J1,ڱ]?F~0r:/.O$l:!QJڃ"Ag`(,18'jf']>KCOȪXzǤڪ# iYbEd//^\q$P58cB}ai2:=*f jݸdVg|834($&, `{Sh[BI5q_ep[L#5eֶ Hk"`?LDțuO# ɫl}-ُƝxbAp~iR07 7(8!vڇ0:M. ) AP-&7;P# 4mYp7l׷.Q P 6Р2h/,$f= 8\48[ hL@ BHm_QYo*RԹϿ?}) glG@@ۉ<:LM̋{f" oP=)\[4C@L>o~ߩc;\APIN%a˾EI5bM–;gzNP> [i0լ պF\|P̼c'j(r=5ڿ.6=UHgpZy JT2|7z MɩF7茺&0T</V2FһHbIhT d7ښp$%$ 4% }BNQL2O8hh* Vg '@$"eMJAd rNQWs2Uc!0FCpcN?M%a@"5A|02[y@)b@'c Fh >:Di4`%cL B)Wl{4uހXT;#\cIcӕ MG=MflU0{iFSZxCp8y;)?NHY.XrL&%Cv$#ippPq6? )$`a^i& \Gx|f[َ#^_p;,kW8e),qQ"۵>;S;FAm~)UL',FBun{j$*}vspo~2U S`gI#aLfQ.;i4 ^ nI{іLE&u%VUW$Diմ^)a,D{na`A!n(?4w֊UAMZz )|^rLG太]H=(mY,~i4u8g6Q_*hK1N[Z5^z(JK.ܤ !ta$A_#>&fqrK㾓[$14E JØ9ⰟQqî&Gbe@@$L:$LEL6h&TI2O\S(T4Z# E4jX+5XHP0:&N""2ʠ]_9gڍ帀#7?ҳg2ўJThXLd5NvbMt> F'_Y ӍAkef79ln160e3/N_#ȁanwk(4.:6"!٬d[GE7Zm;`u4AXێ油hI$P4mxM2DV_qܕ8C@-bbVl8g+jV~[ّU0N1#ޟ5̐4dHgdU%432 V 0ƍmy5)_Sp~RߚPa4&T {і j^R8r1AڃXZ"`¹?oFɰ;(H`F 9]R;WJ (n,A@c"sP}PqwI>)leǴ2)`2)MҒ15p#z8r&\,(NK>PAhYJX;WL]*s׏gq;PyAFW>ܝ+xT6_nfŶz~h $1o~]"p(sylп~_k _1P^WYXg?D&5@Wix|d{VRT8[`m:IDdvC_sv8:b:#3% `{CK&[ x-#I?4 YcHV!2uoPL띀m0:j56;މ$ cPWrnoKɗi xQJvWя3{oKnB+g%ب19BjHu=+tDlv\ywLڋ5mH=G$YbuR5 |-s[PG#Enʀ+xmmH H EK6TQ QNu)x|,I-ێ>DX4,2>tZbG6>()%v>kkn\S9j!w泚h*2dmނ8 0EZGr#wƳ~i\.q+j*xXv6%̑Gz;k!Bwg C{h-ぃIh mE@j-@{*ѣgʅNтo4-ZSG) y QBt+g(fm$gI맳xT0Ͱsm5: 3b慗$DMhu xirKJj"mCP@M!`E>./&6.(|P [eHQFa2M=${^NOVpj\1]lizL'K8Rɩ,&ю$Qc낪4 ±`T1gwR:qR"qNBTt9teb\+6G0smL]( 4Q:Ype 97<"@rɲIyrpOrOQY^2q惋27$@m7ivK R[cHݳ;ǃ,pkۗ:Xh٣ T&P-Y]'OW,Z`:+{ ;һ2MC <\zˮ֯g*3ҬeۆP$MoNkS貕(5,О-̲mUxs/lF}N&n'?5 (auaʰЇr>&1^.Q[ i1X3cd4Ps'U \!mN $4Zp7"$^ژĿBg%T1LϾPsa6Z bp3 ^f:&luR\^;<|u5pY`FIo4m`r %&{m:> q,{/hu@t01\3;i@w6ebskWHbc;~)7֓,1Pv XĀ)?≓H p)uk[e+Eyژ[Lx,4‘uBk),BGZ mzƺdQk`ΰ 拴Y3pY (d.Oi!Im1Pۓi-w/ k 3l!yYĐ?DT[lG+M+?BƎe3AKF itg%+6\ĜV_r sփ ܷ](}F8DI7&@FMn_ؤs .7Ϛk1&߇:tAלYS8]` q.@߭$lYW;b1Z"`VwW\W9ʖb?]2L['Hk!ӓ2n% 2#V~(ظTU){-++FK KWA]M`B̬XIۑ޴[dbwx23YrFI8oUa'InZkA/%*(gP̪1&iT7Gt@~jWG>%I:G%KUlQQ븆{ |qrݫ#m&; (鍜ZKe0X;dS)l:hbP?M}O¢n$&&'sTD@%N3惥7AzBB/PASEF惨n-c(m9d|bOa*䶝;֐uleRSCm4@IȠgjYc!2gn.Cz Yd&4aطQX-|å1銺&֠Pk$nʺN{mk):B7Ճ\,ycpBHh5=ӷ])VC[K9Heos,SNgvƒV1j;,L`7P^ $oփ{ aol;$&y$bvœ>ޮȉnA7S\f{8X 2BNW8l~+c`9~٬yW .og mF,ex60i0X~7&4ĠX}@XyNrv5jM/R-:ON rOzLѺ Cm,2co*}:7&;"PƤ! +kweSNI.zVZG zs^𻤇$f:v+uKVC $d[^59}9+p|ofL)4|b(c$"S Y{Ygq5CvG ,ėgc dYG5=~s۵kd`.0>h4+[D {YT('n-ϵwuH2pG>W a8晧&{o@ÒB$\/{9 4ǥ$8}6@ͩw^fT,: .:b(IpN^Fmؐp;MN2-!6֪KI$O4 esp'|W[8hp ;|:BNˊ,Գ/E$b8<ح]<|eQ\fRiucsD`1ρP"OU8,Fx̴0gP{V0I&h J"qiTPpȬwU~n?ˆ/ͻVm_vQڬޭF{~J?Vn$?8ܕc+#.n#2&rp([} WtJԽ\68t79E Ā$P#Y#ݗ]P!]bpPݛT+BĚݺ:,nn0XҬz%AovqW9rk(èӈdrN\ׯ.8ѴTn@^pM s<ܞ)>]XP}6V$Ѳa{W`+umbpeTwz8G VH] M)Uy$bs,YKalnZM쀚e qǍE c惞92ҁߥz) -++w֜pFaXrQZџǟՠAm2(!H AAJY 1?nt8 h -\WAu\ mչ8zk uP%6nFU6` :Wm{w)=Ƈ6rt޺Hj^b.m$ס F|]цP'5yDF~+D{ea] C#$EC5-Gs&GZXs5K?[!P/^-,XGk+#;F-DyhJ.GFeAnKXcM!/iI[+0XHWh?Meo(2{'쵟ӼLRًm4zY#/~(Ly+B|1 /0ǹ{浂SNJb5)VdžЧxAKU[kRL F;Vl%(D6!@<&u@ܚn!] /yu9,ڐco5ދo>i;Kp20 Q=Oa(ːtg\yHЃ^F}["+ֱdž3f8n|h^Kípzm/RU]\CbT˧8@ӇDU(ˉIFi'.d{ 7\gc%̸Dgl₰]"gvA6o'8K'3AEôEM=ԸHK [, 1P}VFNl6$ jeDxAyV q<6YT\>3F[ģ5\(PXWZ[rskDfbH Ms^8#@$_4lN;$Pi [clCh05(zV6URH8;g!j;O'ڊy:Ǵg`5)XD݁ܚ9VJ2dkS$a@Uj!QΑPw4pY23i;/g,3J K/3ry/8Ś4)4 f3HEzP:<҉8?*@8+k/H^]9 .S55E|S\ZkS}#܁br4a@@}LmcXq_Oc p k{Xgu8ZZoj3Z&qarbFL٦6GC gub"yv bs@C;kg IAVU#'zq5oԌrNa1_B3A1ux8zj GuMčYH QKfV7BqNd^s۽*dVA@̅ѫ[} wk`'zN%fXgWJ{K)#=c=ͼjYkqq$2¾0G5N3u(,ޣv ͍)'xJæSTJaFJhY&!IZZs,߾+FVpyn, ]E"wh>uJ[4tiG5^ĭ.z!rIa7N^ 9Q&@$蓮Flլ,:2P-E 2"l$+{ ,׊((2h2<鏰"QA)Ci7d[p󩱰4EwSj-2|!myPJY,]9 n%q@V!,6mL';Qc"gxGW1eܩ$ pZ6G4@R5J 6cr[0omzC)ҋh%T l\M @{֗w`4: @R7&ySCE[䑌V=2GA[ƛT&.EY"Ru=+Us*Ovm_ '=^b۝k . g=w1\{u> AUP|s$+ձJR;nkw'=\;tC${t{ZفU= +_Pmqg^lAw9fŴ]l++n;nznǰ(4z6Ӷrmzlqj4dz%q=7@jm:dMsW0͍J)*qH_DǡAE8f z-Re%vZVHxUlfSUL+ g~VwLC f\ v.Df`KG *n'yf~D/5KL ,( 'x{~惇]A P,*%1XI i ^q,XX<28f,!07˖\"AM8V@ cU&%GeOYZ42I85yccbq&,]RQˋN񊭢z]p*7M0.g؊8ܒ#A3i,IvHPɡ0WڌkH&!4(RunZG Κٗ(u 5k6lܣ4?}N|v `G@z~o底NʨlA;P,E+,{m6U-F]R{LCT(\YYNwӇ< VKB)l(ug?EFXqz< ܾC1Bfd,-ݎœCe LޠX5ٺ(}ĩ3 qu5ѹ:cO#Owzz4Xo$RY^[snp'?2jDJ퐴]Ә`.(0M|aQYUW@;WMywQvՒ+U p>+wFc3@-(4_%6>ݺVHZ+7:c@'մ!$f֮Js0.5hԒ7]Jnzꖤ:oZ]@X 41 bNJm63Md\I'1܆Ahg|@z"E1{g%: vA1$pqt$YAϊ9!Nʒ\DO%YՋ)#;R#qCVic:zij)j)wl5KW\ gGR#4`ʂ5 SH,dQ#[ri@,4H~4LBDjlXqּߟaΠ3KWkVWH"kQ,1G?5#+,js([ƃ'P.Fv֊*23+rF15Bʨ[jB젓欲%idan4YX7;]qY,Va $ک) ѧYz )좽M{Jƈ%ⴗZM0Wn½ 'ɢ? lx g{Z&x 2 zqǃBG'I @ݱ Mݬ *1 {(j{hZfF j0av(sޙY}qKDe܆*I9ڍeh T6 3p9{u&eI:NbZ!^4?ЁjVᑿn]A6{ ]{lR(>}w˕%wAwk0e>E} K=qB5 (9 %k.d `5Yi" }Ȟ"TPEn;mҁM[6lt +l{UVq. p#OlPTtd,@H>{V@ҝG&H74_*E"w'*dnq^ZOp@^l(NkȽHw|泽bQr3Mҵ0^( w21h(sJ<J 5^2]uyn}CݷJ4]akÙf7AV4 @$2o?[PEZgxFwɠUnФJJ-̌fT 4"i>\ld'mdhM;QwFC"ju1i-RB01!q:i$oh'"@KQQTjհ6JllJ+}޴-q!Ւ|YZDAUH;tCÝQ2^y#4X29$Ыxe8eŠ *ރ"F|9910icD;¼}Z8l9'9e΍\;oL#+,]4.N繣x& KɫH;@nTFA; `Mp$)PK ҧjkv9 ѓUdԳIXoWZH+Ԓ zO Dd1%7s*"&A d 31$%dRpH5m[Bh5I:LT@ҶH 2N+ٜC q3>&:vl?pQ &p#WIڠWX;km2Pޮd(t`deeàL45FI&UĠƷ\4'4 Q+pcR1Mk2D; xހ;d6AYcId, Rk8y$]t3g3q,NcVOϊ"+ >4֩(sT 7^$[@;P-n51i]O ektі8>)=PrO#L!j^tWQ5YQㄖ')Qn^drLO,vi6( Ү'*c *s \ "q8^*IKn^}9f6_I;d&@j,j5חQKłu~scTPI;᥷1@ 9%Hy\^lH! icHp@Mn mkʈJj%F{5$w%Y-5 #r 8bcYl7t?di*v4kV:ϸkAo&8$Z #xRFzNDBGeڐtR5)8{ gWŨ4H5!uus/5(Q\EIK!*N)_5aU{WIi*>Es4r#?j.r2hh+3ި5;j\E-0DʞhDB,j)z"+x05Nu#F4D4(.zPsr)X8Ei3o[ MO ,@L/*" gL R pҝjh0 J U$ ڣrs0;|Rێka$$1# C$Pv9Bṵ)ϏwR-qހrcPݺ* .z jrUŽ6\jѾ Km:6"I7KT (1Lj;Pt^6*@z$y~`8"I;tr\@-8ygZ{cWe#;Å#l4Oꃭ1,cey،״}åjbQ;1x"zqlN$|c1#cfЖ Gԫ}[ZhToXhxդS"`VQp:׌f3(-w b1ͭA;PApāån9/X0?4WĖX|P?.5k`pvCi}QI40wZs;Y<ȹ[bVbeYڇ{Cw{9QBA߹\3L;泰)V{N*Efid?THaR>Muց"4@OJ9Ht99qLyf8Hޖ\͸]G:sr/?ɭnI"WhŘKdmֲ-]mI_8hs+lIܦ昵SC!sAUG$nr;UcJªm FfHdjԅHY=R@8Pz1Y 8XY' mI`/\.4#``ƃ㶼5r2k;XߘTJ]/Z^x&XAe"DP(HA0H[ٸXebNt`LL}g̕67Axֶnaf`.hp,ce[{A $^qiPN[%).'ҪPSD8M@rvL b .IGSl@ @؜Z_L.eI+ go(ǥ#P-Oȉg1JmmYʪ4 NK{AvLP . H=+hc -i!quBvY}"\,mXܴ(fw[ >j4W*ҞXcɦI[BN@"pkIL v;n=J*!C'KfI%8P6‘Vع$HYq v,,˅c[ @EK}(N{1_=h`XiXoQi|P/%{R٤w@P|mMMҡuI ҇yYt:.w$J{ەN - +hJF .\u>w'zh `b-LBG58XƀHZD#*Ma5JT3̙|oֻNz=\Y,80QU|@uyaU76*hYf}P\ |SvN=&8Cs'+Vf`os5#?ސn NN4j= /^;xeiKwʲcڹ~!w)vaNEr>(aۧST9]YE4 )J)7<Љ(@\$ATd(8Ebx #?5G2mt%sXZU\bzim,Baz~>kԑ~hi#KL;m5KǧcΜRL(d?>Ctڤ9$n+V0ڨ$z es-UiH3Yn=*}O*)[>;P,p7e}(s5UAr2K t ED' ԧ,0QҰgؿEEY,rw85$q3z`uW1˖(0 sR|㞦9S;FԤ0s@D f>vn b7 l$mAɠ-HU!urJ(vwI%mr6N(7nE RE>{Q6`N8@;P(23[KbprLn?TMƠglf٪$CݜJrŲ49"U\X' }tFdyyw@0tj J Z Pms$ zp+@T^|uX:b3Aj*Py^ԩAMJ^Ԡ'yUPW?6VA\gQ'ZԠÓ HMh9Ԡ7JC|T Qb,n˦Bcr;Pe2Iz"r ~)٘Byqoح%mLt'LmҠF?M@;Jk&ٙ5PVqHF_*d0+~c U-x4EwxΡB&+yH| ;7.  Njź+ <Ѱ`F(+*lg' "5$Tobk%XN5]wޗ_wOKR{Ž eQ2v⌻ $D a'"[uu:5dވTXEi=X]iewzUukau@@OLPB^3)²UPȗ8ѼҾ-((^%1vG{T1 ҧ(> ȈVv-:y^ZI͉r*sW4ͣ MX"HBzl+X M=<67c݃j &~| 2FwD>tl.,oEY\@|oKAizX-B˫sGۖ"H[B#↳Rf:YfI̽bk%cUƹE\rY4.ݺ+I+oV.$jn$(>MvV!Xy,.DNw; &h,I.6 kfag$x^ITQv9TXڃ[HY"S$؝uJ]wPʯcФpcVV= ]4PR;W$ڙ@5RLgߺod4 KXci?V)n ԃWN1Oz kX; QȖڔnwnk感aʠGQ@[0pX땾k4Kj2Iz/礸k4ab[Ta3HXsI&0S'zMdߵI;URWOΠ6vVO zb$10IvYoBǕrMƺaPm%BC]TiXԝMjĎo:Epo(/ßT@7sLMgDPc4PwAGAc ~k-i?s9h`b< =Dgt$,1ʫ ;g(^|8STnm-'J1,)$r~nĨIںJ}Hʛ6^Bu kmR4WSAJ RJ RJ RJ RJ RJ RJ RJ\Lw XT&%-lNⰸ=P2t! '$tޝC" -eBƇ@C3wH ݨjx 4s3=mwp=$={͎+cB A[kD}lŘuȭs;m#}1T.>gDdV s6~caMb$$B.|Ӿ~ڱ8=wɭ mSDi\k6M/S0#٠椅6S1DQ@)''rҫwl~(fm ?BB+?wQ\BV~(ߧPm?x(:^3JŢ6Zc7ofQԌ .!W8994DQF[$d=j"4MI+Y9 ձUnP+hZ5Z潔¡]J'@^.t ܽ-$lh67F`W%î¬K}W!W#Q;W5cq!vKiF,Mk/f]~h:˓ӊe=ɑ5+g;biu? Bg8] 8G7h38,lR;q u}OC]g kRBs|_8ig?AU8xB21A ׹Ⲑ>( 1Hp3ւTRTRTR̚˃굩A(YfV?5rU1(>I!&ڣqR#'?& cj n`duF#z-Kt"7J]*ƣіWlA9-kd0#)@94:]I*U@όW{~;Pn1f%uJkmб5fp׃J.n4]iEs\!d 9Ai#*s@;I_p;Qv涖5LT1i#L [);_;c!}I)ڸ(PJ&IdNVWy1`<;e2Ґ Nd\rh|©o\czV}Em2(#s@7-$rI8B7:c:yu,2| 걙#. 6Z|%;o g&<$6616}cN5K)c@sQ2hDŎm \H^c7ނ,J &7jה&u1b&,ڳӇN0P>E/{C> \IbM-Q%[ #N(FE@eF|mDVU#E lA}5a-%A@\:f; ޺~7xE&"ǏVCl1 .">;(Y,iFU#1F:ʸ]A ydY#j$ࠖuV ǭ5N>ٚL@(;@7**2hp'M1uS8bMAʤD 9b:饕ڸ& 5~4v^ X2*\ 30ӫ井OSKJuHQptN)ҏǯZ_vH$`7^h@ٓI[_Z-`}`0hle794}9g^؊5Q@jJ zuT֣Wkɣ;&H׊ *TA*TA*TA*TA͡dVsx󛖄AVH$XkQ61e'ay@ MVp" )q+wD06_4.8]QƖo`dVn]$fדݫ+}!5Vx18l&,s) {P*iQƤMmt܏5E9Y]Ik#/4D`d޵fI~͆:yMwOۜiEcH Be{4P؂h۰T.˿aEFb'VԭInAuqA ,Y-{i5[ƀ˜@!FM>h}kx&B0 +^[ąNC@+gp6,qI`7u!hÐzxMalxE&a[i,z$ I2B6B*=ʳY3{hm< ;{H49j' K{H\k6I{OpM{e4&xZ.dM:O|Pso>*ӻF PtcS 4Ƽ"OV(.MjUpunv$ev-A{v/O$G8ƁMXC<+ި6I#>@ ܱ۶79Cu9#|f}5ι:߄4`πN|BD5 1_YNkyk) 5#9$0PHc8^6(!3DA{tRpkki'lPQ\[m8vYK*j0 nKW+Ug [YF5coqX%Qϝ1\Hfar3ځI#9լg$ъ&%XH#4:/er{M[klX4M- %aFcmmosEbN79h;ړqYC(γ7Kxi#\+gqڟRogc-ؚI% U6G 9POR(E`Q o dH֥^5u 9X# ($[Ԡ5=W^`PLWygU0MGVbC&-PiPך*+E ȡ@5RZ%MzVp|4 /Lqq ںR[|)cuVUS ZXp6E|SzŦVk,7`iݷԡ] wZ -GEH P~uh5 Qs-8y5@x|1Z04%̈́6Lmd5n^PRJAR%nA J p aՍߥbbD߅^賎a;2~ rDfΜV\>VKW{x[0F:o\]r*X+~A^R"r`oJwE{WIegf-5GM nC(il"IP,MkynF;7$8FW#@Q't*_aK{u+MzXlOaxTȩb9T+ &FHJ#v6C.0>j0Dښ[[4h\ ՜,H'R3r~(ٕug+J`N q^ZZA7LG2@MoiFN;P|ǛvҲn2;e¸׃T'n?b:^M U\ s7/%ǚ͠ah =nI;fߧһ@ʨ Qƒu2p@3cb`Az|Չ#ek7vS( RRRD1_3B$ {nƁp޹o+ D8-}\h<[bZcBzËtpQ5ԬMsޢ[KHPG<1g9$6\bF0MnKA5^#dp.+4pS eC-ٳu\pHܮZzmĮŽhm/I?=jb ڰ!ܓ9 (ݫ; )Fq hGd ]d} dBsհÅ1Yv+ *G"9A΍<:Ǚ.X3cKoGcj]tbP?hU Xv5isqhFN0:U}NW۩(b64Z;n{py 5t3M'-xs92j{tt\)14޽(03⪑O$%So+ZoaP7%\dP@HW:xKcCĥP2{W#bIT,O?TjQށ9#x|@}fI,Qq8ڷH.!F:OcilYq}# pA}Vm*F(+[`o *PJ*PJ*PxiqN.̒[J9܎٫(9Gp8dr'l0zjCk0zWǽeea"_ca4 8<-&d 6"Cica*aVYk(N=nEvuzQbB%s]RRGjJ IVRRRR{RjJ RJ RxqւSUǜkƬ#74k_"*VB fJ p)ls4daG8٨VB"([L v#+vc"r6[99dsz-'9"*B<Ḽ) >I=YTitٰhP&$Z,@vlXn3P{7YwѼs8Q[h& bHFN.)O8em!vlO͕zr$duX Qi$(:DDvdegI!UqږYK:IC-Kd7>+%Htځ MECc]@څ>f.Q]26*rMiRNz(%J(%J(%s_bDʚ+؍>mX:#+F +iws)[hVcؽ: J"P)<4@J RJ R*PJ*PJA*TxX Pt潠׵*PJ*PJ*PJ* W7ػ}VfXcœ@[ TkH܂R5aETA{"LKSI #C&t] .F5 ʬ 8q 2)EQA+?p1;WGsD>#a D5(u(ɬ Ԃᐒ?H8#s4-L%DET,X£ـ{qF!eAF%f","7btg|8P-,]*(>hm!C0b\!8떠cvwJcnNO.!wϊa:3?CF[i } /N]S⹛'q#Iʑdc"KnK C" tlerEbniRz'n0,4Ϛg•rE*t߭w|Kt )FĄjRUg8dW6iXnN8/1T7B좽㬳A(ThmƽJV(FImJGn浴Kec';7Kbwϊmn"ιOcڇ~xP wRq3jM#F:V0eX8Ne28l'oQm $`Y;WNY#}Fg&듆mk V &B1(@ԙvsjZȣ,$g&O!S2̣23AKʫY;v (rzIc\;4Dp 0-ⴒЪs[| URbfڨkWz}õ9Ÿ\lk:R:߃Ix]oj6E*{ӸxPPq]p{;SH5n I?ĊF8' ,clw sڋK}Ac$K OAgh4[Clvގל5Hڳեp4 '{ل!Q@]>)9x2`>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ïbKGDH oFFsuG pHYs  ~tIME &+IDATxa@ P_)X2 Hbg'}7eD QO& g4EF Q_ ieD a?ޒ1@ޛR2@3?3td~FaG3K0@ C~;ӽBK=ӭ|Zs)/(yYG81uU>S_o/cTK+R9H&~JVrRxSeM/U]U&9R\_eM/U]HH{JH{IP{IP{IP<)͗1a۟g<ߧ9.>iC;.bvg{TaLz9Lڜm3>ә"zfRosJNnf>mN){)eo;NVy}-,ΆO:GH:H:H:U 6$jt)$/"IENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 4334 Text-content-md5: f35fd7099ea6815331d216e40bd983b0 Content-length: 4334 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); // EOF // Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5470 Text-content-md5: 6445f637b6a0cc669dfcf09edb013e49 Content-length: 5506 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (set-scenario scen) (scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 6659 Text-content-md5: 4a00e72b1f307d1ca8663601649fd0a2 Content-length: 6659 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (dialog:add "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (dialog:add "You see a broken window, looks like you broke it.") (dialog:add "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) (scenario:set-current game-scenario:gateway-bind) (set! *current-scenario* game-scenario:gateway-objects) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1745 Text-content-md5: 9e9b001593c20122899ae6f8fb53452c Content-length: 1745 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "console") (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor2-bind) (set! *current-scenario* game-scenario:outdoor2-objects)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor6-bind) (set! *current-scenario* game-scenario:outdoor6-objects)) (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) (make #:adv:bind (advent:makeobj-surface "console" "console" 250 398 228)) (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario6.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 641 Text-content-md5: 24e992dbad9a47515b2fb0cc61c2785a Content-length: 651 PROPS-END (adv:define-object scenario6:tunnel "Tunnel") (define-method use ((obj )) (set-scenario game-scenario:outdoor7)) (set! (adv:bind scenario6:tunnel) (advent:makeobj-empty "Tunnel" 425 240 125 120)) (define game-scenario:outdoor6-objects (list scenario6:tunnel)) (define game-scenario:outdoor6-bind (scenario:make-bind "game-scenario:outdoor6" "background6" "background6_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor6-objects))) (define game-scenario:outdoor6 (make #:adv:bind game-scenario:outdoor6-bind #:adv:objs game-scenario:outdoor6-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario7.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 401 Text-content-md5: 119124a83afa027850764201ceb389e0 Content-length: 411 PROPS-END (define game-scenario:outdoor7-objects '()) (define game-scenario:outdoor7-bind (scenario:make-bind "game-scenario:outdoor7" "background7" "background7_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor7-objects))) (define game-scenario:outdoor7 (make #:adv:bind game-scenario:outdoor7-bind #:adv:objs game-scenario:outdoor7-objects)) ;; EOF ;; Revision-number: 23 Prop-content-length: 129 Content-length: 129 K 7 svn:log V 27 Yet some more scenarios... K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-13T17:02:44.000000Z PROPS-END Node-path: trunk/prototype/data/images/background8.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 65483 Text-content-md5: 6ac34c21745c5c7f6c4e267810b64967 Content-length: 65493 PROPS-END JFIFHHCreated with The GIMPC  !"$"$C"C!1A"Qa2q#BR$3bCr%4S&c ?sݛWT.zqh܈Uy'Y/SYōo=Of'ctY%) 'vV#ΨGKX0ִ(\#?$Yﷺb-- EWkO|8o,2$lDN^cNўq$&+i>ƿ/w*#ΨCXJrX$Gbb6t۩eL-C+Js!\4n{TEEj&?-$DRuP6YMĎkۋ8C+< Uԙxb[06\rۉ3ܧuy+!oM)#fR[g`w4WXO'h= ]Er~':1'S]ô?_қ>-qZJ$1y'\ 5w5@qm=köe?Bc{C,i{G:Q㷍S+hn$HGŀE->ҏЈ;kqܲݖ'Gr*ZJ䝍>dI{ ;|*?up4@}&clO'K%ˤ]mxB⣵+\Y"?Z_N(54tͽsǚ쐗xm39gE 72 <֧ژ,e2<U]Y`ߑ@Y"_Xw o:d7hD?vwp$Q{h#s'dGk%-ф@ Ҙ鹖x[UUIDQGJbu }}ƴb\`1c"aLfHz9 1H6@$JKeG{;a{`_Uա^W+q]E@'H>k{TH̳,C86;8vQdR9rZ=C?z>oi[!ܗp1≬Wi[W*` Xzi {Osh{;gyRA2^I !A ;9h5ע% ݮ(pMzЭp;@oT󗈆aX1Ct'ZO_#k&JC i:e쬠ik:vHw悻8-;o}N`O;tz~db ||X,DrP,\IԶ7Xb>dzB{#jB]X[fdK!=wvq=yp!U sK/'3I;O:j g n3) o"wV8cƪĞjn;ul=h ;Q2Enhzn:b7o;UMVvxb%׸ o5)2=GpHy$o7rs8 kAi[gZHfqC<>.y0"|jK5n.$PveYHF`@5XAڎBlWY~jA&]=ս9$o P #fFrErrwkN<<O08@;7 5D^C>Rc@RvTs3e֎#^8&IѦE]1h1Y{ٱӱ%1]%7G,mK5ѭDP0MOd?A "BTu@>+1AnoRGhmlo;Z(_'cjtf.xS>f"RA#y@G'[lN!d6|+..#XŹHj\J#o7tG :6ͳ;F>7 $FP`^Г[F$x\o=%ʰ$ 犍.:#Xwɣʍ זՎ$q;޽Ard@Ƅ]Pg,n(nGw\0ܻk& ۤ${]sEF롇V'xȠV}#W~8^^ е\tr3HXnܧ7_Z!I$"6+qրE ^n o&Ѧf5-w(YM8(tH]Nmym|< ldF_o^-̺4IVZ}v?Az$g,I' 8Fcz\n-NVȈn '_Ha@$FwȱX[M)m~o5v!,ScKeV?>"iyJPG0װ${MM2cYK{d`9ߵ*nf !c;o$,Zy$o9׃E+~"tpw64K[V@dSKub'@nSD0:s6m-Y /j fxlfXq}A94vlm;[ĨBG!#r?K?B3K7|oawyhv=d.,(i7` 5Aogn"'ɋg:S߽ [Y[;߽uUuRl1f oc,sK#7jou-( wG#3R+#Xlc0c2v{#u3|~P$U4F c4P~R)l$tzgŤ${]YG?P8K_HK>:i?*LR91&M!YؕMTF;_N{X h43ۥz8b {,=덾:ͦ@f*;m?г-*'އutJ]_squ$L5SN<[ok4NE]XHh e?PX?=+{J.F{FՖP?$T]v6ZD,QH ( YbONF:[U6>⅄No_@e|C2p:Yt*J\B׈IVd׊ktW]AeizcADJyY87|z)u73XrjmKIk3%j PJ屢ͤ;.t(D+'xURku  xtGh^Xc r`YCNud6둕f9KtX^+K\{ 'emc1V叚}-2z5=!;\Zg[+@%h GnRTON\-7 sҮ?4$NQ'RiR_gE5Llhdce-H\-ϣuxv6RG"̬I޺p*䭝l ׎PJ5W34 (ojdKlM=BX/E0\]E ]0L4E'ށ-s*X`)_ķG<]=v6{FwAo,/sRO\[aD6һKKim* FOQ]S90]n{;Pyq U1DkBEc$^Kz&Xۧ18RuC4r;jibLj݊D.g6uƷl,Clxv*'\B)5X?('G-{DO/y>xmR(ƬK/@:4eewjc|!T'hs#]qb̰F!o>MDn|4a4ؙ]BVi6S$i;S) 4=ǚ 5(2;{sWKooemD;恱ڎ˄,$\+INuM#в (nv<лkYgq-Ĭ9?j vEjI3,G ˯GKkR#2*%(c ǽX9W/)k٦lBu{8MܤImf@I̖frTV%!R^av|U_1qgHc֔\*c3$9:ní.%yO#-xi"@lfN#!C.]s{+H䷆(${z#0?LwE06sHo$[#U, 1 !տanҀ1A# $4z?(jՐό鼆E]pڦ^, G0G+J7źC#k5'Y%n<,ˑƨDKj3o$g3+BC'x\.-͞fB;} ~z~b$&xhcގI3XdWfNdX(l2WPܯSgu4$xYёDZy,E(ߵ_T#͖N[gKy+h*+)#h )Ku(; L#%Y.=`0"*rOEx.(m~|9"IHmwG2Q[b gq눱[{! ΍ܨ٥ {V"*xhqM [{BRvrƋ[tn\S$Id'n%>(4D%|V6pcGxvycB>ƸQ$e2.7 8"|.$ϕF;2_a>3V% ɭk1`ു};QǶ"! :o5uѵIR(9;2vnX2x׊0Eo |OhqE1$Y`VCזvxV .<9RH>@PA2|| x4+[i!b}||o.r3^5Y@)\I{Ĭ{ckS/D?NϔP./#r>n_!{#41~Tb; 䈨i@VVPeshcfJVI`+64w}*}eXʶ}^vРаkI1NuЭYSyͱܑ#ZhQ+\';y4?F iA$޴7r=jSCXmـ-$͡PtGBT{ ^L$ qZd!Ǩ1Lmy9%QoD1kr"#\IIm@Áj/#НRUW[MrT =ꡎHuwF-ɘGȠT879e]NdBXhOH d7Vsܚӗ%~+XU][x"֒Fnx;XKn}/x-gh"}QB7P nxfAm@щ-N+4Ʉ[Ż,iD>ۥ\57Zi]P\6ۅVY<>J<_SGnmB ]&+CvޔR>"9.;C{XngI=AGdKʍkU&X") ݤޭKPYW~)\kg՞kpガ]"cj9)1~#X<7~+u w.v?Mah'ui.Vk`k>Q4V̩z- 6yN"Kε@cO\nܣCև]ĦLpsAFN>+>+mmE/1h {k_Qy51~1V85m3zG2Gp^d2ml^)p+QGqlÞf,WONǧ 6˨d^$D}(;uFi$ddo"X-tfPz%'n͢5lؘm"YLjx:nKe=ܗ3.ZXJʱީ"ae:ҁ$w bg{:?Z o9m$F~v|[J&G{GG?0> }aaIǏ֖qsh@O;ɬ v 5g;fRݵiwqߊL绺ҩ'I7n'py_괲F3! 9\U`OKװ-FXn}@y&魞1؅PyJV8hȽWvH|OZcD#'|Px῁'dx< [s Ƿ%n#0Ebu!j"7X/ # ږ:)-,q6N>"vDo ]78! UvU%Hة}E!ȽtJ>ϊi[B lz(np}|dS4ir&)LVr$@ iUDTt@}Egm%JIh'~~%+U'Zw߹̤Nv|5M=yc[)b =d=jneUe֒Fˮ޹qx~h&c11*I<Yb1mqA)IB|eԟ֐@E ehCqۼlQhtY6W$?$_ގKae' loVXXe'(elӬv)^\=ą1Z M5Ӯ_ڒn;7iUT@>;Vuf`z*͏wǷ^:;nǖBQ.8Gl;}@-8[7^S5oϬ$*vnA7(^*û ӯˋ$@F̯RC6]r7y2F6cnsmhDZCs&3WBķ'R-l V t>U>;9X5G"1x`m#cb5WoJtOsHcA7 a7 J] ׁ"ѥN$COL5!O"(I{ MכK5u5j/u^^vJ%:C2׽sOg蛄 6Ot,>}~Q,g}FKDmc wPey%( |ҵ!!+~qXLD,dAB~bOk)jt@I=NF9@yrtݣR{ ݤGbbm-!H,fZ \.Aq AHT[\D^ =5XFSଭ٥`8: A4PuG4@ѨH/Zc{(D.A]%u(ADLUvI`{k׳hǀW-{C6νb׸'DtQ?2'j7ڢm0kPuhKYO]ة+| ѹ}kKD ׆W%Z%Q>t lf<Ҿ.rqH"R LW7M ȏ۳٠abݵ_T.ZF1cT`c oR,3 a"B·҂`7f/A2XO?J\fM@42~i-jb: @㷹]AQ@LfΩ:%ixGw1u1H̼>ێo15,#tyƱ-j)]]|5ŚPK(>&RN+r;< xgTG*KǼOڹU*޳ wsjawS*79EM4bFa`QhQ#'Wd7TFAQ$#:Թ/qb7]10nCG XeK:s]pׯy!gX1nmlyU>&B<~";tcРP1v?noU55a=4NnD;;;pkR4O5>-mkGֈIkƢM$ɠYH2w0M$2ƾ1[Z&6K9$^K sQ5veWmQ~@ Nƃ[g0B$PK>QѳЫT疉&8ocݧ6Ao}Ԉv;UcQªg1[Uq}vY6;#@χշz;L.DkӪI{R[B;Er=,wi.~]ǚTꌵi8/^eNNKCfHсHRzZY`$rK{{0w+ܢ#0RV$s\L6=A:cgpEq1I@<4?mNtfD'ۦً֔v(R16 w8JYm.Z!#>\ ղz2,D b?krd̠hmV}>oPk~zV(.ݡO㏋.'xcK}YO7+,/ۥ zi؈!%oF֋(踏Vx8R̹bǃןҺz[Q,{4.rH;uqt ^ܟy6X.Mñmc&"xE\Ӹ73Fխb.ۄ5YA @#GojU] Эmnbڸַ[Kf.ѽq,#Kq95йOU֛A)YgR勵2Kp +u]͏ļb4i^(OG:Kr6BHn `6vjf;K*ް}(Vb)nbxn ~TѽE E*D2(q/$=b yvY9V~f#J{4D.lYg+z_}m4hw{k@l+aYorno 4qrFynI@{F=yWӆ;=8݉F&߾k@rV6-ձL^X],U41n̐M?Ҳ#c"A$[5ަY.#PThPiC !؏1`c\Β"ۦrvxƢa{Ы},I૭hvSZv<ȡλ>OSLOpP>2^F{M[FYLq⃥4aTlLwN0kIA=f䲂a\#(krr5TP}-`/ks%8Le(t)?lįbGNk3edh#@9Q̎}xIYk Ypp\Ynv5J.V!qGD@IsVKȆ) lNZ9p_cН#=Գ T>V>;#5ܗ1.Ѿ{#z#ՍGp |^zo^& 'j[-b`,}Ƞoh׶E5Ž뜐c;IBKi2EjUNj QԒC=hA M vOUeSpŮd.|(j[D TK$8#r=|QEQ{5]3+jk CeQj桌e^=ʒf#֩5qC$zw-q̥6 [nx4P0n#Ohh그ϑH9\pE$r\ľdPvߥEg?ŏOtiXe+UOL\@(#ڪ?k/xu}+}P =/mbf#k[[%X@ئ qv%xhv5YuX{H dW%cDllQDEȵƫWٟOc(K٠U3}&Jڪ+nңc/m p *%X[:涬< X_zڼ#cEw#P|qYC̀ i|Y毲l=7-bD+d{]q_?zBc׏nhOKxR4 g<!v<9t!q =5]tB! ;m0֏- .`ǞEBX,=yrQjxvkFy9Nb22o ^HdrId'isw;7; B$u[:=1\;A_j#ݕ(ķ(IF~Pܤ<֏r4}R[#uib 6Qq7des8k\m=okL>q}pAۢ]q'%&EH#Terc/h;:Ϛ%/{vA߽w_fdb!BA?ڡ\L@<)Ԣ;:&&kZ5{GA orc\*O@؋mk7|lEx>S޽yke%׵Tks)N(k7at$H:T#d.+KDqwM# KF/uEIn^Y˰Ƿr4}oI{kz8ۤ OhU_]Mk .>΅YVMl(=⃻E+6B(PᐇvL d ҧRS-mˬe'J,>`|YỬ#;rg>G\#ڸ>L~8T|RxѪ%{wޏۚiϷ>UTk-ьPb@bzQ +hrR#|G*dN>{I{Tݽu,o !^u@:ӲTor]i\E[XdڇV5I[^5hnol9b[[eLZ᭯-LTѿtqܙƴ!PA,4;`ҤsN;TP\oaz̤w>ܓR,50Hƻ$:a ĹydJ;FVVe2'S0$1Sьz$ݷvM-Fũ4Jr;]aFׂ?CQvcprGi >m)ᮯXI,Ln8{ZbⷱF E (f+D&S {iM# 7 b2,X&}Ҍr͊:$+oaNTY\L(.J:_+g,,jxɕl* qM}DCm3d")JB( Z8xmM:ZA=-nfmNGYcTk~&uRhHFb ˣC+ײPuNpJ.*K罻Cyرx>"YfaA岐A4@em)v=lcFbN̥>I q*;e[E;wJ{R쯬mJ3G:*ZDwЀ6rFQȽflux8bGgg^U;ZeLaC#u.XT]T{PU3,qHtwWΡ+,hB:ğ5h۸A}VVW P{7Aef@Ie n65n.b61mCD2ub  8~ղa+͝sۯ6~zm[ NZT|q[Vߔ[P|m{+Ά{!k$9aC 3lAnض5l7WYEdMޕݪ-j{pƱ4|*S:LA ]V}2mku|{yr@-von2$o&NJyCojVv C=VXd_ wu8Ē!*=1Op_}kc]3HѨP}dVG-.N6yKA-n{GֳhCu}"nF]hsڢnooõ~a21׊A Ve\z X-\ݺC]sTtdT6Z/l4% V& [qb>Bh% #?GȮs 1 wkM* $o\g^Q<}Gwg{0Iߟҁ}ec שKpQ7;M&ԕ]N3 зzFxڂ|5H%ROi_ǂW$fٌsGX9L^p}{xǸ!:Kt7Ko.uqu㎻و"}>h {{3dkI1اb_qQBݾNNmK);@'ry%ųjjt @y# +w1<5) ?y;)ILQ Fq@3!LO {TJ$hYДj7bY)65^K?vNt}%1 ă9<[@LG;jk{1,wyt18o$u߾3sPB[Dm=1-H}$~r7{Q5;B+ Hx<:*׊[P#[bz% E_$)!Ɨ7VVu`1FQH^uK&o'O":Nk~1=đSMoZށo1Z9U{C=v^Lξ/5ϫցlHaZ{x$O anޔ"wÓMmbUi.?W͒I/#c[M,U2ebH>_Ab~ZX;(L2z1ͩ{ ?cxҨaQ CgҦb$vEtwhuow6r}ƪ黅HzF5̰oQy׸k{߸;L(AeVVVPexߧe^ךu4YYgֵw[jT35ÑCQ+8_L5VWXK\e.9UP|fbŬj^"FH61],PvXL|xrEeCKC2B6*  1#Y9'Ҹam举y/-Gcc"{2r=K^)EY$sj$Iy1T[{7vvf#D #}kk-3lnEw)g2Flwч\q~rn(mrwv,c'@}i{5,yY-T^_ua$H{7ޫ[L^ywN? h&Ge .Jlerڥ3yHZ=N$Jm,73}܉rG3pT+-iC?9)PH/9e L ƬcYcU7P:\Enor'.8 6E@cu pv.#X-%—;Zb$!;[LZAz銰HouE+-m}iҸ4L@~ɌV)RtA>gOeڀ3G פ ?8Zs}>&;ҴbdP,u4r&#ᎪV"F0fFCo1 | {u<.HA,RhԵ!;>Gpјsᤈ+74-&8-]Ia"d_\FKbN̍y;7a<'yY[dNnE0ޘ;߸븏5 6,|ֲN8Rt2#uw 4C5kaoe47K:4{uv)?llS;vn(8Jۭqb+6;wb9\sO}uԶf) Fy;GK,ndO&FR.Kb:?jܝё^b#eq|Uvh2NY4Twq1.X mQs}[>J,P^.̚THPF Ha= Ek,be]G\ŭd 7Xx:Kus=416V$c#p5Ovsc)l/.{; uKֆ@~(-h19`th&7_#҆fG Xw t`?0pKgkԗt{Y>#kmcTso\[HĨm2/БFX|l++Jy"-̶_(@>`Oh!tMK+.8mq{e h2?ߞ+]%yb68$%HuţIΙl)'IJP74~2א"ZTkY+mcpνIfU+HtS\\SpEÅ'wlS!Z*;PKeaaǚ:yKcu(YϨc;|uTɏʰgŽ>T*-]d+y գQAg=~X < 1?O5ytͼb$\ Ԅ۽̊ԏٛl6wċ੫guk5ˤݾ@?,Wy@tn;~|PlvSrFТ+X%~$_@m~b}-v9xo.~\Gwޝo骳z/%ÅfYϡE6#ll6q5WT|!`IT,G9q;kШևL3}=[ܜ1wOF׷{TM&O4g He=p}VG' DT[KS֒2FA*v#,U | 3. a, c iVvo}@ֽn4uAbFlxםknAs15Pt65AjǏ{{J8#Eu<A ٬n#ƸQ Aⷬ{{wXn!vQuK^#)<IղaadA>xN_O练FNQ>32IT; 3#Y!TNA MXdFO8^H||0*5n;yX(-ʪWTX Ud T15NH(n#{v F q*9^5@$Wcȑ5ˤ{Ii-r`Fkڒܴep$r#x`6>uI41v3w虦*$k~χxI(!I'00 P;}RDx 1Alx^T@$Nr;QU lDn&ڨ\:nE,2.+-̣[Qo%U J1EBȽ4;q}(*NRYn !\c ' FǝSRJP#(qc^ ;: P|SeRe&#)R4uxl ڎ+DB_.A/מ恀-3y\PE<2*S5 AfKutRGF'aqI{@P .@:} "}Q s~nE,1F:O0;fۡqɑ'Y똃}6do[ Ml M?xp:[R>+(9T j[(;,㺆0KvwRA!ken=Vl׆En>ҲF^޼I֠ƒ++ ex =Ò g_(2Hwϵqluկ|r2Ckf1elװIG@;eq>ƃEagZۧar8u,}%֋ uE!I팟ޢPO;Zw~HpǸy_%(#{%Ri Tp U☛Kwp'Zj?qX{<=P@n5pwJMv?M@%$GVȥv ۢ8ݓJ8۹x#=YYda䃭SFqv4}u@&^돵^ UR]6>f Sٲ^Q?=Ws,A,F?*.qvւ'='߾ԝ"[?X̢OQOZI.ڤEVrMyqpf[f bѠ*X N%1Gų|)Ofz#`5%NʝWʼS 9ad;s[Fǖ}S#ԓGx ٧K6[p"MSA+蘶JVSwSʫz&*(M'0e/,K꜓Gƀ*Zf^7뷍 kaa%*qAqвz%A!Llk޽.&)U;6&)cuM>AԌ,Od˟pi+3WY7%pV>IM9M`m)s&o37b!$tR7B}w1oqV7u$U][I$ϰ 6Bn p$A~tSimi:;T|bm.~&rҨ}eVG s4]##x,zvH8 {ut{ cDnٸ+0Komxw+OO$-vR |iy$yqGu-%hk\Td,x W9]2/dF5ikČ| xz }MӶՅt"cʣteFXF~ $p}>J[!'E1Ͻa,0ktҽG:K{KּW~83DoV:?M[CK99:⁆ÐXNKuqz(v@7ŧۏD $˕I^GD'GM^365#r/qc<3wɨQAuBINު@α PSz1glfny ^}-l I}ɪ6Sd2FF NJhk{k+(2\uc ֿ'?M~sZ]y_'k>2?h;";WsOjqW'ouuԨ?ZM n0>ׇ(=;^wAҲ~kjQ)dF?tI{bipA;cm~i+uc4IrKU{[!wx&D2D~}:N"LeI|Ekq2/`4 [84g rx?ZwtGأ+{+qyiit-!nu{߂C(: P F$AǤo*hbh,m9Dzᔟ;ڌ|칆G whqW\BɤV ( ?q}9 QDzq.U} i}}5[!v֛-klC*.=٤w1N,7`Pv5@ˇq4UdƆQ*#^mYw7NJz9։<"5`$.J4)v;؞X'd|U}V"b$`RGWnj0kv {^8ܩ$&.l2$$OҖ yD_6!`fA2sd-[ZI])sn'Y,KDhkC,žB/3B{ϊ[Fhfeg<I夼(o,HV}o$w~/DӘPʣhRxlO2)/6[Q+2p}7KK(%[$ Ż6w jy-0P"3>qKh)mF'4nUC" Zw4W\7'׶X3vM&uZJ,4G fu[d>''&MʺYBk zv:Q"2o^(lk-3nL q95CiX<+ZI5Tk][rPq3x Ѯb_U#u4Q/ N L +v(tI:m}H@?1ַY휞NX_펝HPJ]GRKt]15ݣF/1p΍ Qs2\X^q!, Gւ]gK"]"NWb7W#7I_&Kd#`?Ƞ84PcI@B v?]k[L} 2l})qQ 5&}0;׊aG,G?Jk˯YaH{oQMJ/g|wH}I{װSq$[x5o^1ej@r?'c}ZH Z9_HD^@b9b1ˌTBt69oqM.T}~c O=X#uXך"Ooh E̤NS=-h&uo "i5A2.j6UMmg f'9suNvŕvf]K--/ JFmQ1y?M1&6m;0]+K0219( UJB122|=!ڶ ;5Z^e0\ܰ']fۏz23@+g|Mzy O?lQwX2\(hb>RUW^SKm ; Oա뼌@HQAmzHU!/]cFAg40ql(-]gնMv(l7/c`$悜vn7*Bmv:n#0dn?5 [f,[cWxv9A] ?ާ(oz++=Ld鑜)Z iO{L؜}͠XbU$$ ڔ1g'6R8؞cF%[xq*獸?Iü МP1ƈ6u&KoR4WP37^th"c&G⢉ͺg{ޫ<>> #{ags׳ ]g(ָ bc@0]A+Aq* ;g}4h MgpU761a"&uҁ[[o  l3mkuo134~}i[ODTL-ml1XhA%vkx^k|-i#۴Xlٌ(57J֒+wha(/+[[^hkPM,Jo]ݝ2*[33p#E @!{mPQtMg#]*XD 68UՊ7Cڠe[APC&:Udoa]XK"kH00N N7b5d^m۱eE468l#匏$y,$0:X"*PpHSnzb{D^J5ӼK:w9 m݉cI NSYO}{`&Rc"6a"H%ܝ3( c-ȕ`O <G#gKN[Np 7="쥰Gf`Mw{ ysIjВ4sJ|ē HPKFy ÅB/i<n.'\wyLVhU:P{w'޾|O[XZ+{,7w_aeѮe(OkNbamzSsE 4:/CmyݵcZ㚰z~\6D(i&8c^E:$@w(ԟ1j^7%[jx zGC{D%qdL17cI?(͙"~҃oD^"l–*($J~Sؤ?jX,O[Dz?kq ѳ~ٟN'vR/,J| -xb_MB*PmsF.% 697k<-!pGAd/ߌ;42:cxUY`'`c\1S?YA,~OgeFhyf)8`7L<]RA5Ҵ1ge,0#tK m^n| #<:KFqvV# NƷ E[VwlO`:d"vu==za D/Ӹ '(U_Z$xh ؆J ެAÃ)^lou⤸W@=J7p9mjkw*5q#G@~` d4UU-'r\|2NNOL2xmdv6MUd ^@u`A#>l"KY{{|;qJkڀD$FctV,2 ~]is<Ŭxώ=Ni;w$7@*+[d0qvj9cSG3H# Q{z@ϕ{o 嬭=$v㸓j մF$؝2Lk*m\PYs^1op֨8-ehTK"T+[;gWC ] zNZ/SE'ȠhmHU^PgW&d&ҎWSd?VkhNސvހݍ'ku1qT㱖PUVW}c!{$Iq ˺QmaVfE'GGhqOnד >Fqii-1VrE랮6#jUm>4K3<ާkyKkH'֍{uvT+ .{ь2@ a5Iz21󭃺{fx^HSx\F"Xq+NKUr,h;|C,c mm~1>ZE,H#=:8W8˘ўO T+ 5-'|ޛy^D_AP m$O% msR2WKqC@qAr72Fvii-`{,t̷ ɿ$![A|*}JFI-T UͤqwKn{En/bNVU.ObI7N}CukQG)WRgMn["@"x?{(K%+R ku,r*G)1<+仰zDPy@=ϙSa T-"m(rh%Ky䮞>j_Dǹ;M^/9#mDz8w<|ٱeR:(CpΨ*f7%svn/fvt X\D klzc^F<jk(ӻ@iOރ312(sա[}/>*Բр9ۓt\{ f:ϽNO.g#[׆ޤa3V%ittN.V(btcSzj hoa&*BlmqdX-\C,RLƸ7կ0HO wpwA#eNJlbުKl^oKzAne'W/U3z3!WCfҩ^Cq$y+[2)%@ڦ;Sf c^ . {ޙx<>Or]v|Cw eP~ i%8Վ'`HǍ)v2p58Z(~ +$caHΊ޴A,Y+@8ǒuF0r '+iSG֡Viz0N?(#N \2G]<*O ~OxI"/~ǀuP~X-oOؓĎӃpLĘXbY۾9Ac$0҂Wzj!Ȳ=UrD|uGty>|;,V7=uVf/hYd[35@9hBOMpH^&{N阠[v{q;~|4xKFA*?;inmrcɭs^v~FэyS[d21m_Jqm*cLvq@/ⴂFM*~\/ެww7bvB>mUc?"ϿY؝kV=C]t6MON>0:HI$m{ 3tm4X@ x- x2lhg@asEs,#~O$iUjS9>wT qW-w.:&ui7ζ~~65eGH-"3 {{o qEvO"(^~jkY1Zk~uo؈~Ig #āh u8x.{cqBiܤV[ oLF =jBYRZpٍfIwߓrPpV9c\'V8mާ\CT%.Ch oj3Td{T;…`_#7i]=asI#A.#twVhi %NX00f3ʃjXa I$$I +RCRIz 3[->ƒ✯l*cHۼĽo^"yx!DXEu?J߫V=iಳ2ѨTgIw,JIgE@m㍦UykJFǾG$,~T9$:og'ڀFL\Rx^tȠHW8un%I$-: + kpa@}+vdYՏRA[<$MU;|'e>( e0ϓX4ҚcSGE;ekme@vF?(>xRGOqF{{m2kQ\R3Ƀ'byPNqw(U뛜A@rOsBI">b˼l;_qI\Im3gUm0'Cڬb"{'Hn9d.iL~8՚-کʴ,T fT(bo kryA@HUUj9sj݀Oɪ۰7 Z}%2N2]'(QAK . N?5)4+-zF{x]V,H[#+CϵX_%)wb_#~h Dwv.bfY hGًh,ғ(>No7RW\ E0Y̭,zlS6%l tI׊RY͒U&9~Py6E܏Z(\p_4^l@Eߨ8օ/Y5nVn\o5^OQz(ǿDFƬ N#W38PG\_l8+O#ҫqY.drv\]+G Xptw9J;p}Kי|:?AG <(ݬ=ߒrw1؁7BLXpO 9ZzhB$> {*%K\t %+2֏p;% _otx y$-xrV61#[/w@p4Vo47KurͤYoK;P5SwƐluU)#X-ݼy$!\]öNԹ $$v†5c:{4 `2x4,e¯5sWoO<ʊWzFA`ɑ+#jRW\ (/w=W~bۙ&`t;me[H%Ѡ$g2K}I W+"y;O:}F0~Gr{֖EPk^Y#XBݧ m+R_M|sQ1LBBR.dܬnv4Oop[Z\7hXБLXc´Hy!ItL"ybފQIGkuDkȂؚ[dieG7wW\>Sg-"@uToHPF~}c4UhNGy<AIa沯K##o5%/!XER|h(0P˅hZ .GcڀE+vd\qZ5k)8%O˼~5+44[Fl`1()ޛ6tMc&y㛽ϵ>}RdgJ֐vpOu>4F;_sp=FP3d//o `H@{q6Amoޫ~ '"o9td1 x>"tuY1sp_,tgT+Tؾ\5i($5gL RဎAl*, #ԏJAm#{ۗ3)w6Fz ZzWe- x'Lc%kы@u^J8M"쏣P1 spz}u4wG$}w T#n=p_ª~pG4]("ITw| lr,ı iNZOADl .uP./yv&S aQnFϽlt+`ز}}7|i$Ml11^6U5DI*v̟?Qߋke?m@9Ʋ[%P_ F^ F%|/ Iss7ON{{GUf:"H!E|o,f[kT GiS}gD* 5m}mYAC:^{j^(9q!oo5H aKԒ-q=T@:`Et>xNK{ѣ{X[龢yzhGk)^y.wCep7C:f uDem7o|ަOV[%_D㵷y;ZVҒ5HOh9K"QSU7}U?BNXXe)>,r)>7VY%1@]7smp]~ )chIl(&A۶oւf>o#2#|Q 34 ' ]kKQނL׳2\O!׽P'!EY46=n1^@^wLx>{U)ʻ4n"fKpiLˤRbmM$`z{5i Js@Vt@E {k]Katff2oJ -,ꁍ2Z fmHG:+k:\TeRH$|.WҺpYkEn6wFb] pe<'v`%>>#Ν\w^L{e-)+lT(b 4y;h+e"G*7q I5!$y }8񯮨:xD-<$sBg]F-JcD A 7Ef":1|_?QIfeyHuѧ.XFK އ#0ν40wcڀ{QU[ 3'3fjL r<2C2n_H_d0bħ{[~ Xoeh6@ϵ7HSc<p߶{&*gOynET ]Y!PUu3r6 PX߉w7tFJ+  |/Üd吶ANt\XJlj~O6}#HT'i.+lZ a;EiqRDc̳w2~Qn.:p/N WIIaefc`u H!o|Pc^òޖ/E9>c"a*Xl@J et/ n<[Dw]}%\!PaP/.5Jg#C:48&f*QVDM*WHt1rwѱ|GmpI'|wm33|׵ abUPԌIES_}}V]S2+Z`x;S@- R{bHuSnN¶ UN?M-]6b?_δ[dv'\P}YU oVdMsQEP*pޫ^ֶϸ]yr{pY-HLѨ& ͍޼E@'CU@$/5AeeeVVKPt'U* 3 G}|%7s4ܟ2d%5Z(, I.nf&R0helpmj;ȁLv;,]=y˧:;9/.[(®?XJ$hi'A0׽LDfqːAohēu}3Nqjgc>Zs*5 b,唏g҂@& qGcgdӳJP $nXQ{Sz#UGee4,q(*{A{/+ҹ3'HNKo币fb $,qvj籖b2ϢXȋ5uTHd&fb VCk26 )Θ߅/ab HWcױ(I'L:-'7i<I5nz [MqPwlŪi<PzvvmݛHP:( 'RP=տEYt%{?"~NnmC^+L-m(Azvi0tŝ!ny潻Uqȡ]a;)߈i9%]0ҝ55ǯspQky#Х): nT2F0׊n:ZHQ[_tewH~6#8W<MOڰtGABS..HYtnRc@,Ok:G$aLj۩yaYvAv +c)b (W?s ?U'M'oP˭4/7|mch!0C%s|Q˫L@RH}h|\wh<+י Z1@w-V662J%G}%c?`D>n~i]1ulp'hhom-"ѽsHiLO4%:1WE" {KŮvVey?ށiwD9^xPz(?'&o未+#lX)ԹFxQϷ@Cڨ0cԍ&tf*xk\M3}Y;j6PLj&0GAGd@z 6//@'iO]oB>҃ddnuENP)\c{}9I$$߽<>*Zrɉ OR{^DȪ\S/*C\ OSBH$7-oȂDbǼurHdww=9 19!h `k;hb!;~[Z2>4ls,7]W^>*gZ |[%ڶ< j-e6;4{Ie hඝDGioK`gNE5Ķm$ xȧG\s# 6G͛hukbG=Ƶ#{y׶5m{A=;KР j#ÿcr9'B(xV&3]@1.@!㿋ÃZBv߁ڝ YbR˽pk宑^\Ŭ E ߓ_S _A3I˯u{ +QKH#cGT^ H/z40䶖v!APln!FU޺kFJjHPFB(ڃxRB0:WJiƄ1<+++(2CYYAOmYADaD<:q]8鬓lcMu MJP͖:b'([P ej#(7b_>0<ή=6x;k|gRpJ4,l^hbAHcKv-"@kY3̱>j=m0pu`O;2'463p-4 lm!]K{ۤ4Ỉj-F?5/1- & 0kmk e;֍FNS*Q, /^oqHL. 1: oq6XĂYxZ:&_/oPޮ J*,J7{8BV9A.J~ ^%V'a5[ŕ $o;׊XOWk ]: rh2m:Ñ\~^e6KWԖ~}IGp%RvoT:0@湮"Oon w/ .#sT)@ae!46nnOhtxvderO"N:M#un4$Fng m1^|yK/ v!c,1AH9*<Թ`k"kꂀ%̈́1cʥYmPޙ$v\A͝`L 9Ty{,B{i]2?ˮ8Xn`^T xB*KiF-{juasl,(UIaMYA( D73;ڢЏG XoozţAs~e#ȠKho`xIq8kToGuie,q:CHOaw4HHP}#mpHEڴ_FҲ$e(o:'MG*`)VaXQe-Xl}F&D m΁TeWqZ|\RID->Q;|M9yi7PX OAg֭e6+}{6;`[e*++QGFm>(KC%[~!XƠȣxeA12i>w@+-ԗH`Г G. y]*=ƲZX 2/+&BnS{?dzGRa:ӷELWPA/CB=,{=xm2M"ƃ>(53$ z %8,G_cqoĎgU ;a]}Em!n26:Yd׺ [$|"Hc6Ap[GKA~R,<f7=MLxΠĝ21r g˪?Ǎ_KFWPv{A}~[VVPexϵ{X5.[WA;"Z#iv=+BӪpRf7")1('?j]fMV`p@F^4@,R[W$fni;l@lsi'oo>(Ă!h?)$j@rbdV|{ΪƭE:I6CuPcn"\(T"ߴEܪU0: tV6Kg~I;Sj]@Xaa+b^spwԊAOE$~qQs7=l2Y9rZM8T,fyvh[1=~#uP5$2" yةbW<J~v&k紨 WwM{4 T<6`Pot;-o"w)B::"KMm 8޿Q@ceېo`Tnc!P$Ym 30r`uۯ4XqKo]m7^?/2R-#"R$SmoK+*dR?ނd^n[HQH+~wF@Y[eܘQ.4>3<`~nM2|ȝ\yY3𥡵.3f6vK+\JY1总ݘHШWwY3!`[C=cҐ^D ]|d~`!gD;nI?n:=w.A:f?vfBi$,~VoojZ)b] \SO;mGC5Ar^D{o&Mi%_;Ys{%i=@4cjNkKy݉BosAe 1HrMM 5T"%ғk+7F-ʳw P뼼Z n<_i}Qx-c"𿈗2"CݵPYΡ[i5NJwp#; x?j^xp>1c5t ؠeKxB%bH^72[jl$2Q xXGnnA|32ڮJ[u"bfKU*yBla(B >i$yGN5,"m;B%ZBT4+Du>X 0!] @ÎV홂@l('J|}so񽌝co l,h,?vM( ⺌,Jμ;oR8|,w q(n1/h)r2d9c/}WRilli۳G[/{mդ]Z"'dhps8٭,H%g{ϠKJs nCN_Q.-.$2ށT>^.Л/ wilLSg]‚}&+bn/PHU بGo#PC T~Ӱe[0|P^hBcu~ޕX|eƟҪ?ޫ(:8~;;vV"Gi"HzNb2fǦ-`AR=o/X-# n; Pi95itDFho2֚mFKki>Q|H~խq{iZY;UXcv@V-NsJnjL\㰩->VC=H@G?T~+&^bP}1Yŭu(.dG$XUIٗIU^VWjT][ԽAh֐04`CW&Vg'cD0~Ș+Ȼ>h^F4 w:D,:2wT3H |ž !@G=uInR'|VӒ`F`kM8e*sR<c POzF5b믶[m iV/R`/b gpxז$}yW1&[gS_^;c-xN'jDgr%Qi$`ҽs̖"EtB0w6,6p7JYދ8(Zﰣ3߷;5Ht&K9h@X VgO'.ew:hs@YC uA5AR]oL\B9Qc%2%B΅,gnNep2[\_Jc-qp@y 'V~3\6zb\V&׫U"BxU`GҌb2Qd4>[)3 @CgDc\r > XΔlurc@ RDr?O4 ԙXfXa2H:"߽q@5Ϛ]ӳ߿?j  >{g$vF1~QE7{$@ƫypS:](/hrػXnc_6J\w [_6Ig2w PpX]YԹ<j<>Kd?d&dyWY"dt:XV7b NA=>*B$OD_ʞ*ޟ陱YEMz5<}ܢXqjlyTfCpʓ {%Iv fccu}{m5/68cZc!1qMH[ξC}fJHGrG6c\|)#xOqoS^+w;6[#ވ,F+۠C-gu7F,* oNZuHQv<ԫ~fh57 Ӭ)4ֆN}j@u bP[`rW'-ε&Z IPx̤wIX 'k#$VN8n 'ֲdx7cl\vz(J&:(=׊p6m3\ڊ PKߎ(4[(XDbH8)nF#axrw4 [e>F5J1`wq2M+<ءWrIBc J*aUk8&~yx,Zt}5W%C=y*7.ʶ*Тa ,cg.MuzOFދx֩:e쑶x▅U}E鎍d2A㵂d54:N. ~F}=XI$an}a^4i bIM`doNv+l2[`#| %a..{d І..VѣrDkZV=Iht)fe*(*h:6"ڡ[+'almܧOYK[}Ƕ4wE"1}e*S9k,1);5`t}ռWF}yR<8pr\3e@`m?Y=<Ԕ,a ȓh}K qV߿LNX6+ {n`D؎M`; D+f]Fky L$XCO庘ã@Kry8η*H\`e!Jx;[lIoV $ LV{Wt@?榷Ltէ/jwS-Ÿcj1w҄f02̨bHT }2=i-̱wv?^x\9;lG`{*oXe P V/@ZHv?}%RޢZ48P?1J,yg D^*xwvP+wDkq vfWɽTPYAWOg:V|UYWww sP:OL2fb$hگne2PJkDh+e}Hs̛үoǽQbYH٫Rsb@;ⵋoTށ> afy{Ҷ:ڟB, 6؃hV bA58YE"h.ǁA;F uJu`Y,FP[ɠٱXJ$>W+}H{8XG}0Wۓ[mqrΎv@b6=v#+)>BjO[i:QAz:z{tW՝Uw:k}{슫s_-w7^=_ڹZX]]Kq=36kH-S4n%)%J>ۚftLvr͵ƨ'{d `з~ӣIOo4o+R8 ެ$6gdqjtw2d~GF1m9?H2|XzpA/j>B#t !ĜӶ+[jDm`xVh[[NJ#mkyf֫"(|P((Ym'C6?fTi4six^ݖ*)O9 msIGh'N,R/sq9ծB3,44?ҚsYHl$Wc{xBTv1:e`z|tV CM,Q oqRG v >jaz.nvI֏եM@ z\\X5Ѹ2"-?qSasC `K8&m|ɎTc]zR/VPLLRRI#Ձv-&]Ft);JopĭAfw n;N 7_Z6謫Ѡ;>\neLg+Ț6ޘ_P#ωdiT0Bomܙ$v@7L9L%5]YY<qq<>^̱vn3ZMuy$Qpg:'qQ0YeP1-漸x,{>d|32gXtkٱR%H MP_T+z 唱p:A >Ϣ3@b )u6&gTRTKSFva 0nnU>u-lYV, xM#(z3U)ߵʖx"%('Ӷ@یRm<~pg!fiߦ`YM v2'\YKeM INLa h r.oM@j*1QnHBrk yz̛!s JPkΩKumQ}0Xam-(GOϕWHy}tͲH~g;bN8۫wibHO tv ܦJx խb5@uup6 }Huک9 @'x*P!9?pРclՍ;jӘntx ·[dsqSgGZgoግw2pyh2#G긘snjI D $xxG)b= 7Q .୛|ǣD^Y2vyBDB.!)ik(b7n{Er]/nIHHe OsDˬ$bk2 {w gٙd| ?R0p|A䫪Iܠz{*klV#tX(Py%<򬲕;*LV<O{f5( F5(f(okh̺! os0G[~ڃFj4#-"%ɒCQGw?feb-.gKrW.ڄ:>|րWc!` m=JkH޿SWm#dU PkCURuQ.n-$僻@cVe3#g|FU&Mj6ð]VPs?MֺVVPxi?gjѯҽ-n5+[{}ĶϹNTHy#TGr*4T^Zx,U/y8wy܂> 5u}^ 0HgPQg#̦ 7WtVg v+$hŒbཕV948hWJۚk+k@im/dvUn;=Z%,P!tnk.7,$xZcaNwLeݪ<@B<EN/'ɢyH#D@`k~h&N2,ГOI:)^mރK0qB|ҥdTNl!::k5V,V<=.X3es;;Vϑ`!C^'{wvocҀBKh"%3+;=D^Pb'i;4u%uqN{[\(Yثrth8!m_ӷSpGA:{3oiO'c6Ɖdu+q) 뵹׬ʿ>uAoɑ4 %l@y+mk pϊo#A(c"mO,wᘖ^ 8^ջ(#vFz704q6K('\&6?G?3o #ܪhF%@/L\!3ݬr/=Jz1触[Qeo|W?b(KgZ9,T2$N(#j[¹G*V6c57FQqb1N|64: XT“A JV,6oÕյ5qn8cfr}~>+7ln;w-gBDvN!,Gv7dkuXn8`nvf?6{YݣVRAh,ϝP+˘xNA,%mȊ-1.][B]"ܴ]n2/V,Gވu3Rz+7x42dVi MߏoNmQ#x"z3iec1h%<7K|IK$ɽ o_UԲT{֝='}<ǰXOT24;MV,)lu@gowK>:T<(Td8ފ0TSLǦ#Pߵ?ʿ kc!b{ 8b@^Ӫ7Y.$*i\ضk[k/b= 1C n5](fk{Jޢ^Ӡ Ƈ ˫2$lIQ ϊ"c $ja }{RuSỷ3 w@#IΪ{ckbbb1;A>Fg݉ j,y5#@:PU߉Eor5C7."{:If~dEN̓Jae K;EvX="zcZ4A_Aqx&qȉY43cYe԰b@hlgeONHOox@C-bXg+<Aă@F<ܔ֋j[}&[+`/vՏm~%jykY}Y"4QBs~d~_NL"DQs7BG  PlÆKV3ƨz]꫟EN`<bUgk| om8I ѫ:DH9PXPFA偤_ddU^DvNɭo,q1puSl1x7~~FV5΄[3-Pos5ht6JEfh{i#Bog}2H!j}O|IB$ϸ/g#KϒґeY$Dzt[*Ho@P;wk*=o EcufzK{+'ՕFcea;6h=g Il.":E2"bvecpJXRcq}Pj+й+pn" L0[Xw%4]ڟLU7ޫWɅ[ڤvʱGNz仵{Ǒ桬9iVi,H#ڙcKkc=r'+p&qЇP{@'G'A٩X6o=С7IYoqP27za"*ƨ.WU32 pJxΜ\8ɮm$rlo24 ؽ@׶x#? 4{){8|6f'ހh$4?ԧɨ\%l -?,+K(%)1>]dRH~旲΅{tLێc/ޢltxcE>Xi Dm[B#V!&pNS_"QY5 x&[G(-wՌe'r^y0m+O ޟGv.^x# =ڠq[ŮϛNTX厵GaݣP5+m-ox0v43I"ƽ5UbPڙ"?.(!{n%Ӵ` CѬd14A*oM}S%c24^;SQTvX2/j>U@94V3d=KY ۇ5C1eImӉߓnKGڭ0t& yvf`GA[v̲0vhMs a;hkBds*!2>GF1/紂OnwiC IhٓVpW%:2&ܕi ̲r׽LmN*?Hr=[tc{ky[ZG*@.a; ΀hGc_NݐOy~,ަWopihcc#<sB|nHnM═K iQQ-.㵶X`IuWL<9/[kUC޺;Gp 9%x3(puQ*[ zt I{<>YrA^ƒڌW,\b8rs$HaK X51TN욋$K@PP d&;iR{{AT#WY׺k&s0O1\A`qld=a45J.P\Q)/F}(5#wutwF=|ߚges19e@O! s*{rk96!vbޣ&r\O mPeeeeVVVPeeeeVVVPe`YYAYXHF>^O餠+za{`iq% G<MȦ\NIхIE`AfdAm-Gc{y|+u#BIh} p99e{vR 93!i{XP6xVsy!]H!vuhL [r6|@L\%pIvQ| 1#2 Z_v=9ô;;uV! ( `s=?Ggg{S[@Ȧfńv'@~]: cp4Y\h f]mHFWg__0n[_Uqܻ{ָN3=QzSXWK ]Y%]krgm!n@9N= Ѱ)h@4 㷒OںŖ.&oP6B q@ tݑ#\sX+ċ;}b)%}M,YOt(6эo)6"mЬ'Kd-L` /iO4.Ѫ)S&"^<䧹@ .Y6?ma?)oc} GF@ϗk)m3O* V{qqynrL hV}90 ykQ3U;,Gg\df(K'aNCޏal /x'~U]=&:)lT=q@QIn@响t sT NLvoP%[Y7h:w]lY+2WXě sK7:c3DE|͗Ki=#Fm6Ҙ&(4(&VVzӼK (6jIpy܇ z=x7n񵭾mW kz YYYAף O)c> V=˾ֹ-51${c)3#י<L"2@s+[ӏXf>7@mE3]ÃXe/r? ~#гA߹4p UF`7@3C3B(ҙ -qI'&;hhҮAhfI4E/h 2:;`8"h1M):۴G |wFlI-kw@L"}kxj^;KHc;֗*p4kb\g4,Zި'm0*T#)kƀ{OlfKoVGd:P4!g}c{q1 wP*O[VAgy$;׽ʶG׎)t8 й1(ef)I0޸/ab4p* =\;~)@8]ށ~=ݽъ0g\kU^uvd(T|=^+IS2ޣѹc P' ,F)>ڈZ_dVafz;#42LU|ԫ]̷o$ 3@(amMݾ"願?aVxw$}o:^TX=y@qǩT굚kuQFR}7=%(?t_l6Bi%rUW#Kjz@^ORRu5I8izMPU>zZG(|s\ gvmi@D4qY;JUrlx )fF9,(uNy-r1fhe]eGBEA*}OIIH=ExQA;!+Kg[e\=4`0;Y7ɪn-ݬ)ƛM}+X,[5Oa'-eVO]j-6;u0me(onF^(NXl]@^Ѿh,S/oƐ*a uQu4'KiR{| Ew;Mas$1։?CYd$CMw}dqvrJ}4:yyg9ag?,"WTLexI~ۆWvuUǽA_AvfEEiWGfZ1+U{͉ђ8{N`std XE062dw!J jy&k0^\\^@(sCfߧE3'k0S^)tw)泦 PJ,Dk]\C3)?J yV;La,N;3Lz@ŔRjkKmiIiU41W7Is0v>T /]WGh-I7vfĭ##փ}"%k6і '2lLHWҎ>7}>?'<]YU`~QϽv\VRP-㌘@ }@qVIʶ.:m#-LkIp6:2~My[hD >vI>c044ZIH[+{`ޑ+A޿J1gR$$}EI )T()k-zo 1wsFZh++(5(EgbVՔ6׆5ր"W07(5 5e;Y{YAvՕ^)3nVr@Y (5o?Ja{XY?ᚸј|;ڤE!Mh+_RU)ïz;q[Ā5@ɖJx ҥJE#lMnl"U'.%E4ԓNi3T<:fi]Pc;S\#iǔp[1܏(YęIg`NͥlM NYqv ={k Zߪ1ׅ=HOwV{FFh+&-qjj0 h,vuNlmV>ARks0})>u26+ u?(,랪Aʀ1oށq72+"P{4['shSR$ XUhEJ28 T-n6H0WmsMz}GU]}ncFF(wDe 2CnLme%tH3%l^vGzXKBjWeP9>(#hdoYOhl|.BGa åY,Y$ҟ@ҨF4~褸uehE:?p=QۤipܓSnY $iN9 u^M3r-ꇃi{#gf<^ǥm2xHIUӶVlM>UUToChlY^^30ڲ֬{cuP0ѭ2zVl}k+ {ם+c^l}kRz(ڳB+++((h3w3hm8zp0(uL@UƗ\Nw]hMڛ %"ubQ.; Ӑ~hu~f .!^lgEmFnq},p. .OMOk}@m,_N|\j@SݝGBVW%dH]A{yY.}6I)F3ŸѥռGѧji@}k8fֻhՁd L|M9BZmlK$j>-j$Ay#4y2(H|)n-dxC7F$@v^\`QcgHP uV Ф1wk%nX퍆*vJ4i;rYocCڡ"FPbqA&YQ$p;4"V !TȽ8ǵVG?Ou%:B.X@ɔrR kA?GCu$ q]g[PB.E^?(qxo ӴSC+j{I]WaWWZaySA{|'Gw=s e7SA2(w*NlSI C惴8< ?ڠ_ތ[b`_3Ci(^;jT+yfH6u֘rTKFp qCp -kyO9Ki#*Ls) 7k*4p/p/K- n4U%U k\ 7 $ Ƞ1#|Z1]]ob([X>y[U!Zk3z\]cx (8 zeK7'R_NfmAC~O34 K7b8+qJeE ɢ\1Ӵp M;"IC[䣳 %W=Mڗd*>e/d[v6_kNF2|[$3#4Gu/4~ٌrV%g۰꫌4іB')dR&kى$F?UQKN&p~ƻT*w>)[ "6=ҁSb[i6h޼^++°}=Mrm6RvMhm&DT~yQ m3¥e鵳PDc3ߛjIsA{eo(GP# [+˯q\2_72X kbh3Gڄwx2n%)C'_چ\̀q3һf.td;?ָ#9-'\PX 5MG.m8A)b +V4N* )ZT< S[4r70Pzv{F{!w)%jFU;ӣ3N?ZF-?D-+K֞}gGT{NW=Fky/$MH`/%L֖yI6zuZw=rNJ)mҹKs*#[`0ZE FK< <b^@t5]MmS%=ނVBlo+4,rNN5A$>@GR.2 mzD\ƻ쌑ڼGp=k SN/"cpعm(%LSH sa|2v+/w @(}:x{|s W$*R 7p(TI;uj+l\95q񛙻ۍ:V {uFV.9E㳒I V(Lw(ΨWS/M(e{ב^XY[ JqZ]K "iCP.On޿'oo 5g+k~8%|,l. 4Z- ZhmP|U;&S{WQ%kͥIߊĨwXlWOB ~m)#FT~ftR,\BF)>r]T4Mmvh [UaϩF,-}rͥ?Rn^ !sH4a0P'@u-dHÚuJ7kci϶VN<}W`vl/ZUMow>i3?uW}¨/{LyI!{eGߞxlԦQ$@ԣ}tqO-$Inn _}lmYIVoJA @oP;VE?>7E-Xɖ5bNF'=26x 2ó(:%oW1m vUy0T3  I#ݭ 4QyKAұ\[";rtY6ֈeOĠTs&> r4}f1q$rG(NJ!wd';W<{ 7dYI. {٦Y 퍵Y^[21Iоa5lO8.q$yc@8;P7scPq.BQng[$jel<5>+dYUk> -ᵿ6:ck=-G\[px cښRcHYQx3(z2Wq\zgrgfV>K=7ky:^9XbHCOi<Z/6r{xpX/d >=ջ'<>m̶C&W,@`6QLVI̱0VҳtF4 WS$^5sH@->vLtk -0c+?MYjh U T\)*x:ߵ}ai[ƱƀkڃY\crn{ՕYYYAYYYAx+;GҰ({YA |t{omG"hašVI,gv1o`kL~^ee;G4Eٌ#[o`rTBb*][G%6eH].MS =)%T )kG1~A dG{wڡdl^7u249dc_pOLGG78qhopZ4r(]WJʑJРE'Oˮ@[)"3r4:qJ׮$ X7Fz.1P!Xnf_,??̾koj̳HCBREal 0'^h+LONYt$3 G'Y} Oko'>)Z[C.!ǽ{%ŋLc,ev  Ψ]-$|*Ź)쵍Is-$U_R<&IxVyAN{HhMl%/;",|Pֱ k{[+ALKnJPl<ⶎ)XRȞQⱺ"K]Tb8KO8{b̉G!>6{hʨ?&2X?LP/tm&*;hCLYm@AQ}y$zcE,#XPX`R?#wUHlsp@{y Z8l%",ɭƂZZ]$ӛQqNY~H\E]?*P^y^(b\FFWKq\l6++\6dI 4%@5'7dfGlk`mH Sktz@MmEAJm=ɒq* m(&X 2P}Fuއyˑ>Hwn"VX&sMm+ E[cw4x8Y$)c_Z¥͹BPU3m&v65d:zU%xpwE%k**;|+CI29# AH۴A΀E)帎HYz:AR.#X>1!SDSoFefrIa~aقI\K#zrcnGo>.pU ^ZM RÐÃarP"?ZP##<}yVߤ'/3kq^e[0 *9$mmAڲ+++(2 VVP Node-path: trunk/prototype/data/images/background8_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1582 Text-content-md5: b21fef4aef4ba6cbc7a903df2067674b Content-length: 1592 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~2 rbKGDH oFFsuG pHYs  ~tIME "+͔WIDATxq0DA>RQ"ç ?`S$P؆xYDD շws|xn$O]zAJԥ O$Ke*3eN}VUf|7|ޙce/힟cV a9fe/>tE萮 == KGtG#ѰptI4(=]%  KGtG!]QAz::+*HOGtE萮 =.PIz< ǣ.PEFϽ'nk{!ιά'̼6b|8:0ڈl[1;ݺ֥1tfKy;oȥ (UO H Q#JD -gTiHIENDB` Node-path: trunk/prototype/data/images/background9.jpg Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 74603 Text-content-md5: 8ed028370bcbbfe75f8c357c14ae21b8 Content-length: 74613 PROPS-END JFIFHHCreated with The GIMPC  !"$"$C"@!1"AQa#2qB$3Rb4Cr%S ?o`K*) o;o8-GH#{^A5(K{8xL3^j  sUf64S/9"xcC +ke58b#[9?ڟVF@P[]H1c#ʱ i%Asn;RAH1\UQX#qp~z5Kx z2 $}%4i%B++k3mӣ~MM#Re9S(DQAbK;7x5?[ON3m8O?_h ۵IIq2X=#>8|BK"Q;ANi 4{yʷɧ#Le6P¥grxU<zVFVY.s {T$w6ÑqMf%8gvp8~rrG!$28+aOTM 2[ے`bdԬˇ}c4?V/nf2Zm'ѴpQ-l;p~Olyt6TGz '!fqǽPlV(u"-i^fN8 տ~{18b(5l }&@ •5awf)uOJf` 8(}$0$`Z Wvvid@kyڪ%F9I2G^y<_O"hـRsA֭3W[kHݜsCz+k~ł9ˮNOT1H!u{O-t2h=WyY,G*J.'M/N!h[xǨ\Xx ř}O4Sl$f|.(/s:gS[lpq֕eM c$ 32j8 7E?ɨ:SGU$B-_#> e8ڪY>ojд55|J}*FUj Vqdh#ƨqkNa 0Ƕ((Ii1i8GܾZi23.[QMc '&mV2H% &!CHeuoѦTJ怜d%¨EH&iHK]"/Z4o!]` 'ɠSzIq5BvI:bEqV0ض;#:SHFc,rMwD}0A*q]̀r^HPrV2wH6 ˋ 8i#9WER.Z`bR7!>)إn8₞\X$vm*jK,\G)*Tϥ"29I2uʹ: ۾݉C@ǵUHZ9$*9ȹhgg(_7ʱBαazwBXd K&ū\[ ddM<S .aI yeMrH75>Bnmn1˨?ҲNM-ڌ juy0 CLU"@. aƑtk!ZOw ʨM{6vK1^Xxn5 o m^`oX%YyiJOum#zH,c7 ;/?C_iZqdlMwkY\E$l Պ#po҃JklUw8ۺA?z];ˈ$ v]Aܝ6XQRL]<74̲P}1G:gL`74&tw՞"A"(@G|Ѿy L#9iPi#1_Gmb\`x.j&8$y_>A"Y13=kwu}#EĘi϶ wϊz|v<Z;'>qK D%(\GmC! S7:t7˔((2iJVVJd<PN:n=FpY9jx;׆96g>8"Kۨ?bm.TP:4k 45"o3*,{}Z\hI{Fv?']u Xt[hYXӏxgr "=~D;%,G9[pш.d!dd@8)hfTS^iek%zxD[]wGڮ枚t#ށQd$rY 1M6U1MV>.PhA 9Oq$j]n܃5xo~@6on-c8 PMk04jU}!@ig ZVټ9qGOdF B1ȥ}#T,b(M0,圂= =VAmg,N ryBoun"JB|+-#rnPS 3ކ4A/wӥuڍb=$/&*Yl-=Wg٦.A*y4[Dү ݈2PSif{&v㊺ml4k8`G*ՍvMwc葫ιA۫E+vbۅ!kKsqq-ğSw= 0$y~kN#qڃɠYmoDGsD m*Mj x%ux՞3DVXo^w{TY霫Iv2rw>y]-2\߼ ?ڍtMJ8 $!w''4G[xKH:3Dk)һ)azTk%wSuY2LH'h:@$,`pM<]]j1'js(h+sA!:Fɴm~y'z4NJ4%zM8ϺK~α=*Z]UE[*rDžSS8yt/x,m#x-ނMβ2 )Phg0yn&(0Ald nCqm>,(%bta֛6#L2#G[V^֍$m#G(#+Βf |dX\jy#Ǐj1˷W941oh!=6#ë$½/`H.ATx5ܤN FIޣǵ-u5ڻeV?P]NX cWg 9_XaI=ix3KG~@m;ެ AxbHerd#^kHTx]׺KvJqi#Q72Bƽ5FBh._[Cy@j+&vDonr%bDz^s6e zoѴ+(B&2* 7UL @*thJﴰ-(4~UYw!$g%aEnse]WXM6UAYL?Ӯ3'j F4/uMxs<Y{)r6[ v#1lҵ"ĨE%gށUzy␵ޥȎa#l莵Iw*ijaqc⫿Mi6vqw#1rN[rUo.+9/Fv47 %s:E<q}NiI+%HRh^IU[c[ϖ$rfв77-U3.H-΂!Hb@In\]3FlkG^d=QҤgj I镱d9u8 -@Bܐ#Ҧo⺸qp)-&(&E–;G u.er)kkyh_W$KKҙuSpaYY7Z -4Y{=K~҈<\3иMl<yWL"C Y$H&7P*4Z(c`ZL8< m ޜ>=$Y[lg ($bu 9x= 7tѳs+/1720T-;(zb!CI4ӣ (P95SWYcs'i`=>խ4Y1!KDՔVQ(%7{MC//k=|.` 4j3Z4Q! @b7ߒXUPE[Q:=ZXP6mT(C$U'-RkNɏQP*K0Dd| nJi)q*,ytޡ-I8vǫɧ+[idTA[@{ɟJY+qJ/ڭ A!>#kp;k6ϫlάЕ0:@qB# fhayedKZJ )&#y`?Z k1o۵ŰkkuR9. 8)X-un5S=(%dX淌dm2sV7)vLW*+ !WG5ߺe#S~{KU#ڏM-e;Db4xP0#>|`깴2,/y]a(|QI =lqM/*]2#n| un-cwrw<=~Ntpҳcix"RWb8_ZGjag.B>j;rʨ'IidCA[qyG1Ӻm3-m5M%i"9#Bcbk}eVvPOjܬ91^9eP\ ybl7AKw lfHQy5}.8hmG)P%9.c6uvi7/[c?iE)JoZiDbX>h4.n ` z+3h̹ ǟZxVĬ Ѡ`wjsπ=GA.mp9mx<ѝR\sF]e!G&)Suͪ[,8Ps!DMr m}'Zh"zNn1 xanC1-~O(4o\Ԛ6m> bz/qfg?j5{2HQ5Ǫ-H~(ccȨsjfI/R3$Y Ii{uig5ܐM*'Ld1"W}T-t9^ʞk\Kb f'H {%Weۆ$}=31v [gNa>}FSda;B0ҁ􎗧ߺ |+c׺VJ?7! AfK{ 䣲@7,-eSPlx6reHm{7L3( mӭ71׀bq%Vz^J7gh XZCouŸ;k(\EIQ'~1{ Hr又:|Sex^?juZX8wGMؙ]ut o3F 5Ŝ, #3CSUᅭ#OVYB7- [7N|Pyqtr_ ՞XV"d> 'E~jۿY_\5܍vqsr7ဇIh[w |Ct+fK}Xb4{tB[F.\+9o|}=7jQ376M*DZ,mHHꪀ.@NJq VnUcoF~_{opb >iE bE=P6ce+Ko=B-ӱsX+fݴy\1S9κ4(%4[nlDB4dfF].1yad!  ϱwWZ[fK0NؔsWV%v[+.B99E.ktLiӰf$ mpA*NnXUH>1k7Xҡ錸vwzg Gu -"ӓ//^`Y@TZ\/kK?*}4XP)loQ:,&9 lGyF(vwjƥ Fu9i.1rcPojfcڪ薨9,>}WX[N A^[ ]A<<Ћ5ktӖgI8lQy&7w*qA4#5QC,jI +9C7N's D$'c\Hn~NetesAKu k@ozy *';|J^үtn{x=SfR\Auh=6q!t)fxHo1ivG基2ɖk=2m*xpL6!0(8Iz[̊TڥLV['40j@Dwft$7/Y=:F S#_nE%tݐ{ƺ@G9`yڂ#j꺤,@El?-bG[#+( !6:4r86O"T h(萨/j(*0Gi+4e+qɪZ=ŧTyhƍY46,"=I9 iSkkmu%. z}ܖI F#1>,:kۄI1S }Q-ἆ6 OX]al1E8tb)n;ޘ庎,A.1o}+[K ^Iw4#<Mֵ Yغ]IvڇPiƋ L' }5cEU;?!twGv!{3;#\O#7ԑ@PnѻRL8D͓{N4#P='ҤNۜ74u# :H`mFTg'8>=̭o4I혂(;GMGRm:&*P)`[ Cj}}%EUdPwW[ɠxpPL {ߓHfĪsyW)yKbE = BZezIb8@2j$AZf 9F쑌*)Q rEب"=ѠgcEj},ż œ΢:NL.ܘc5^ul;Giw,T.pxJ/Qo.uޤbEG+p~ƀƉIԚEyl [}Awchdﳹ{U 4*(@jF0h]Ev#|YW9'iB!{x㋹S'ŚVPx PӮnD?ji-V#J)aJa6%@YԴ=> }: K֯:β`x nZ[hdE4FRrwQXa I6XR/ڹ/H %نƫ䏥!OdmHeǩYx%P!8)lMbyozU}L@%l\:I$ +%[}[J|B;׿IUadygOӂe$XPnX9爢m#RݭAc*  ?3u92|nqzҥw VVGPKֲ;=kd!U٬DҦJeUkJ ԡFHibE9ʜ>Xct@$Ы ʉ1INoZ`&8†<W4Ƕ[UY{Xڼ??q⣎hp79Z]M>HX8v>P,u4۴TK="zQӝZI'O7KCqy#-AU4:U)6? ${PWoRmrFy>KQn~b$vpm1V R¥"0ХrFL=5ZU" ,Sna!@wI|yg$pyѡSyAbæuӨ⓹) Uld1t~Ik~Yޠ2}ߚ:E$,b#Q:Q4َ6ɌXxŬ~UٺE!]sqAtKƘ>9=nA.2?Z_z95OHw'J了#0Oh;Ҵ[R,Q,k[;%[t170F7g!qQdMJɸzsڵ|)}8\2ttxPuGZhV1y6csW] EkyŌa ˴F~x4^"n̸4Ikf6acOm~c6aAINQRİ_oMjr/.'H0?͓Co.{nO,s#i#SOyU“G qD4zr0,Ϥ7 \AnݵOkۍ>y]!3H{Q:¥Pŭڜ2督9ǵ&u[Cg$q<io4bp쨸gehEۂ& ۻp2)-ZA2 kٴ  ZB5~#@}&ҩ~ͬS5; +뛭8B"b3;GީZꙆ+ir͵s'"QYrAP,ױ Eu 'bw1xq$LT =Ȣ1m8DWHȩ!х.,Ib Vz"EA[dToq46Wvݛ`R0J◺ZNbI,CqQKqg'x&(fr]A@h?&I ddAʟڊt7vŲ ˃ƗPN{moLaF\˃恶+kMa#li٭$Hh PDdx=+gn+R I(oR繅g37hqh>,Tq7 Z7CΛ*tF@=֥GUa! [*R' 9Χvr cZK(]4 ޥY Q u؟Ep(>C}h$dA<ղovZj q9Wڤ@cK:uƋ8iJjwwrs"Y}>?|C2[̡۬2kRb`v{{)"Rovx(`Q=WYw=&y\zXӮ&&H )w{n^W$橞]&YՌ5A,/ E EePQ< #mP~xydUF> h4b(Ƭ-ePcPy&}%ŌsvAs"D __Qu0夁{6WZ]]%mEpŘ@}jx$ 0,bF'/ h$[62qF޶ۏ4u;뫍X^;`㏭\y 5Hd162s N^˕{Y1^kA&CZ[gmUC#~$~:DM(w#ΊVi2׽51߽xWRvfK*''|BR9]EdVfhfx8PNImyv02MNs@[N+@.FqL ӳ{+MAI7$62kMXIV&(r<83Kh^KRvy⦳}FW{PQ^\qwio$MvU7PFi*#p,qh %T321G-.A򡁹#qH82@XQFZIl'SPC#@995|B֯mt W<OĒ46r)SU.bt F'?o}=ܙiGzBѥ\iA>*!5Y2#4[I%X٢XT=ݹيJ,DѬ43DF`5q2nK7:}ΟI8xhԅ-<׳74&%G>j,6$#O?ҁ3`tA =V@FIN)w̖D1Ƥ81A4 GS%km{:*/4xã&'{wsœz00ؠ-IoPL\W+F0"fF)UwHoi~M|zFϳ3`VfӮwDk7zrsz%%0^. )Z3y@, 7rV(1e>i[iR~Yr;# 1 FٯoȒҴnrW@%"6a'|W=!弑>Ŭ),؀`8>i֖2ܨ{4H#+p 9-fM7Y]NQ#p kG~wwkom0Nf;}#(H2WQo#֯[dH\::sHT+[BT$e1##vo:%c hn9hq}va8(E#M&(ÏHSǟQtͮs&w;nN3@[O3$#w`HnF,ba$"``G~ܻ7q־N:jQA,(^?"ZG0=`ɍaUsk/km%˂cp?hʊf2H`ůfo_nKH1jG\k$}5R+n ,KXlo+7W(&TQ V-l/#A)#8t1b#-̑*^9X?G 3$f0 3,ӺJyɜCGB%vby%s@;P/eĦy\sG [L=>}5KPII25ZI}oo(wF'kx!XIY|S[9aSh!U6Lgp9G#GW4QP+e8< %4^GiND0fw3Y=CKj'b<[GWG1z/k˶yl&s(Lᤙ'ZIN$Ursh jwyl%\7Uv&n/jz! )-pXک/4TRS߃@:R$Q Y=E?P\D(NjNLEK>vs oc*3AVMb-Lo3 3y~LAOtO "D֝zo4(,8 ?J ]kpBˉwjoÝ"Kki3?oQ'h-a5G kۋ#f3~~NYUtL`)2_\"ClTђ{}{$Qps`dz7rpͰsKMw)oE'p嶆ǫrރKP< 䯵hc(8V_$P]K-5]Y8fK˧0[!*~:MAmXxe<^tm-g?xREsq*b$x>jބ"2!~j KӮ` }V۽wH|ڑTYyn^!b4{%teF)ȥ9'4Od3<*-QA c)S`Ut(OSz<Җ@vtN @,pqJz1{`,$16?ZjS_ Q!Umnx*q+ y#4-v*Ib +([pvy//T;qɴ61Pk; bTT`Ot졵ՑeQ9!v#~ԏЖ3EUycd܊6m{I.! bꚾl*֥-sTRI?_4YKeϥA= mS]H#@mirtv}Ŋ( igL2#T0P>.W#wzMN;ː>sYo.K1jV +˛٥VI$ .wom$m¬l$o''n 9lNI_|ӶWT_,Q c9)=,&FrDg7iϧ\4 dtn`*>Ѻ +"abaȺ]H? ~AnѾ6.B;Nb26>iJ|,-iA?+X%ԣ3`l{{[Ę8UCh^uM ~h 4Ww0݋iz_ҴK\x@Pӯ. 2ۉ 'wI혃*;nuL64h/ZC{N"AhT6|qAtVs,J})(c.imKvA?rr]Y jN;iD;nh*]hI]GPV*?j3Y\9_.ʤbv ӲiKe ‡ܜ=uغ)bEm<..`G}g=gɧֹ$Mk3 C%8 ot{i0"sMZ͒OAۗWe%+vYx9#}QQۙP$=AD.[k9S Kg6U|Vgk,6^x2kkp;d$Ʈ\y9zSscn?Oj[PUA ݎ/L]΢4w{ jn~CRѡ">~ŇA|q:5k}VCR 5ԒQw!،)V卑y"Xّc[hoO,J*VVY󟿊g^9Fq7]=,ġ}[uuhCpM%c]=yiVVz#bAmO=MlY [G t݅ۡ]O4S "7ɠݭ-5 |5 u$m&En|C+[$`Zп 2xսK[Q\F "l vOޟEߒ{)@7SZKwirp|i64s$ݴ7 1}qg} \!Pf bx>ȬX=rPtRս<սW'!k0!jHclZ<0<`Kfee#) 70Fyʁ`:}˙c P,G@\; N6ANOtD&y;QD{ 4kNӮk@(T:!k-@KjF;\@Q&2KW:בOs^cڛ{vep##%+a;6x\qAOg`̑mcs<;O& {V?[h$M69۟PJw ?z(i[T8IF`?0D!Yb" 9o0Kњŝ(sKޛ S^jslӵ^ ~7~qj@.2͏Yֽh h;4pH1ZDw9S+%,F Pz.8[Pp=F=];P#M Lؾ|UK}H@|1}`I?Xv/be\Ҁm#)YVLS‹I;$ 4r\ƽ܃=,vQPx&cˠUlpܚwI]JL⳿[6S3%<4upk/ը6>n-tB:sRU^YKg{6rv?UoXf$>` EڿOutʯ~DR@(ۖ'i=.&f=v%Ԛ<͸VsK`aeX4՚dTLa^9=-/cbPFw"1 2,QsTeݐd;jld;PVCvd89Ve2v,`r|V!]j%Nz V67v nؐ'? =y\jRVll#5Υs ` hۖ}A]H<f[vʈ 6Z6 ¨nEMSZ^gvXŕm?ڗ]Qխ3%Qx;ڔq&yeeCJr`LiWH71o4J[&HZRiDKkj2PEp잣}夂@#W ~J_Z4PB{g(alTPHDZ1U^^j15=[p cUvrXE$,sb*ܙI"rricn)1h\)C@8$SGmĬ⢞SWy^Fh8ptɶ>^I2޼򂣷"MpKhU'ds+XwkzՎwGh7Q|PgYQ٥Szmm'P8Qt %rVB9kCݞYQ9]WOEKfHf--@!'_E{hm.ء bxhmQ<}M}(w'睊T Oމ}*F$noH**kY%{8od1uW QĈѰs|xe" K}d>Fޙ:xX--q>?#O m mI$A2G3+C)X1Qi:ߢًG[bfPzɲNNno.m *8'h qeu}hdn}[["!&grcuMaY8"1oͫpi$>2yP5k]e7 ڪ)A<3a ?JgӴ &cHo(t3;<0@SŸNnѢσ1tTl Jʶҽ(cpQEwnǶ>C x݁E5EOPW"P`^,P? +$"9`q@G˻weq_ qNJϦ׭?YĄNöKm4Y>ނ e2ƬpP8j:ř2<0F=8mnNf|".@fyoVB`Ѯ9{ŕC(d@qZO K$󵇏?ZReAE@1晴SH,aZ7NtditL_ˁfzGJu]jRB$E!Pi: n/Ho[ cka bk4(mdyf 1]kSQx>X ?SWt.4lT67$D8jbd|F5In-bUhA! @R$u\cCe%e/q"Ub9L/vk"-coNqJ]6pn,q+<$O1@CH,Hp~_Xd[YdF2h1[}GҷB[=6#yx'eGwvqDyٗ_R{A6t"g).{G9ǚSB;n=d怸 4x(-Ps:=5r@79=yiq# ? Pd[8tVܠr|֝>utx3f@qqPcCI{1w9'>3-ڒ!|\zha/=(/iKY_FުwYJFqI2A%tcm ;jHq'Ho/CS&˂Qϧ?jl_QZ\{up-y=CZv62,E PfX n$qy/WWH}dǚeYtUXl%Y/4$ &)Y" JY1D?HW(/OjwH._h+,H4}1-$` %/P _J,O/Ӧ "VRI A8(ncin^ڟb#yd<ڃ$՘zKMiM>Bɜ{ghk$`6AKחG$+o&@nK?kRjpY[x‘sXJx%yMkȲ"Gd!@r[iIÅn'<晾CL[Nܒxԟ.ӶNK} BݜM-LIu%P bUqiZFA}WcI >a ?j3ZظāpO.t-Z+!3sV7EqH\"3ZAYmsk\2?CXQ-,Pki+}u9\^; QUHΉa ]R{ 9zxLO nv V/dpğҟu X,1ǚA᥍om14#>Xq>tkBerF8>Ps6ys.pŏ1D4N>ʖ!>TxK:]C&!FЫYPF{1,QրުiadE8(?EtA$\͒7/ L֮fnX4`{փjm Fr:v4VBDz/-r e0x4Ӗ4׺'`<ǽhZ^$q1;_Kq` di[+k@F}>Iqm=F}/⥔(`/hZ8uYDռ]oiֆbI (^kqItp>+#؄=Fcr#Ge\|cރ odƘlgL32_={X31,j,[R)O<}kUҤ(K6U}8mmk6r8WNJTy?ީ6m"i6ƌEq4b(wZ;Qp44]UgkǷl[w~ri%{?-ueYtܒM#]}]U dzY!iZ ј4D&ka  >6w aS5Xr6+8==<7bi9PMoS.MB#PăCu/,b2IE-x+"H J31}ܛm-$Y_ujsEofD(6uJ.$p(ǶGҀu x7 I4ja3n%ڸq}L0,k)xss#m;H]|)L@4?[&Pl>X%0AF%1#$dpN|֩mirF$o8>)N.HOSڬRۡ qA^n2ŗ?F4c9Y#|]̶[b';KI IG>^ހevF!vwck"QjDu99M}A Z, R3ðPn˧R #֍]Y;9jKl˗vnFxZXh NwSKsagb]ŅbމTAEugK\]pjֳG6$yݎ< ,=QXfkvG%Ýh幺.+&0;ib^BP5CGP[Ko,@H<{Oz&6e2AOWSwB'qQpU#ws!=#UF9 EoWHf,`5Z \F;w& kyC8-(,~U%b<>)956g sx7?u#v>~|RkvNg I<[mf*R9GM=<)4f.R=ER&>4ߢumvmlE$A@tyou 4l֯յbcrrG-QjmV9LFc ԃG-Ų4!08aځ5M>0ҩւwWm|ܱ&hOp3H0R[;K)3{(l?J ~.㹺V(U:SxM.a ulcGe%^҅1XWxb ~m,y;:?UUZoS֖ h˕Fo'?AY9gA| y?ZY]V֍NGEbj}\ Eq)nqk$ҽ)bc[]?O 'LQ_zRbߴ̃ϟ҂KgaJt˺v`F|)uƷVB!ρB5TG4fQ-q1]N>)WF}Fc,dX}:{k}6[)!X=>gc.(yT;|x|_IMMRw #w٦ 1/$9S^,ndGcYo67ӲH8QjVwPc&{6YmsHLWj}{%\4:}P|1RTr:E\,cnMfzz^!]24̷]|ӏL‹*`' λ 2I> ]W1 3cy"\γnlQkXތJ}1;9㹹nɀ4m`8s^wMn'XBܒ<֝z-jQTO(cYG+Rsh ]v Ò^989ɥxtr(.N=>d}^ۀH} jsU|=ֿr1H9AȢ>Hѝ/5+39jgb3QW-ݹC֭Mm.Go H=FdIC` ZR_M{7*-Ӹ̿ґzo:BY."_T DžZJ[GJ[mAq4u > ,kZ~ l2^`XJ{X,GWv< 9i>mhS恎HKZ T}[MHlȊt@dg#J bGU7[}'Mttw>|h:D9}r*Pyh^A+pPTyG),܎T'$ GF./.DByo@aXF8g ݲ$Y Kni~^">Tt7z OuYf;1G9PnM([2Ƞ%!,^չ 3ⶮ6 ЍqX𦑥B&3H,$6W'Eeq Ԥ`_[3K x&6qms$pewP6 {qAb[Ҡ e>[oq p.acϷތdLW;2c$Ⱦ*uKͬvl(`Us[Dur{dZfӶѬdH&~mJڍ#$h3جKV6ͼeʌgJ\O:5zD~rrnO8m߅8څAuVʱnn3hږc[WEyfv_7;i2+x|sLz?VWv^JwƜ9l}I-Vnte7#RB̀H<88HqFos@:fcbǣk{um{8SY_u]3͙Yvp0j{hF9_RN4#iS~h_ WZ?l~J8R=AtH_p-fE+?Z:B0_V$hҢTT d|+QY@!=(3>Ӟ߬.2(/aF?Z{ҧP{Q8Fr3^2hb ]Nծ3Lf˧\H+A(?zgM<q4R<)"f4 m+:t#Z8 @)GRw`Q^-BI֛t{-*$YĂkt)%zmcݑͪv-Ю4ma.܂H>٭_₥ֱRǵ y 4}'Q 7E:Vi ̘`@jniZrY[:Ĭ3 }3LhbHp7x;#,Fr?zZܒꋰH,nn-AA_RKBQRQ؍ Ti`E*sFARcX`aF9q4ZբH&. R&ҋvyF*ΧyC:YO>*k?3P6؎E{1'hZR"/ 3LLk[ e `V}sk! 3۱bǐ}HKq7zrƣn)C/5kUNKk 'p?\tƒXu,ݢ;m)NMnӻ^j'r-[ Fx:}IlVU ٷ-n}Mpt'<}icQӷwmTe닋㉮/_S뾙ӦY/mBR0f qm[ɞ.&8ǵ]XB*mNsR'<FݹGAi\.gK3g.ojߪA ǂI g X;6!&uc^-FyvOڀ?[7E2Ju YX}_ލSm!Sk;зV;FmSAwMGTa\z~Vi^VVT#w{iڥGr~FN@֪uZbfɠNa\j6O>q(XF9K;gcڲ?u C%H}CZ6]nY~#z7gqmޡDǓMZ {"%9Iu-Jmi S4o$H3"ۓh jg:lYPKczL2?ew0MpQN\y$mA#g0nO4oZ2E+~Ue?Aj1G*]:wv84Vڣ4ύu+ȃ}=JX"T{(ՙ QfڥePOPhS^A<[w&T?6jv-;x12뚭о[H*3|T?/xܑ巊"<2>j,S L.msJxKx00;o kunvt=E15qzߖW!O?Z5 gi:+[8'oyrLσQ-ЪHweӠm?n1@9Aޟm4i(Fu#GK_-ųβ(Ij+5ѰWqyO tFctRdϺ}[,/R4ȊXJt[K-ԷdkL?M {w)KlfkD_c#䈒*9vzwNѴHp+;N"3؋9E 3p?AjMjHoxuwfР@_##P=BLWUInjf [yV#[g-ԪB=d1X*bi_hV>Mjh`cF\9i&fTE XYhj׉lΪ(wLO@vnw( qGA5m\BTgZN-WD[mVSdJ8Ug%c]C][n$ܾؠ5ts($k(Ž0+,l{Ҝz nȨ jmVL;NEs46P1۴yZxmI#nIkiaV񤭻kb&54Ȥep@wH"HQeT?J#}D-}Ѧ >x4o2q|e$gqkMj=="{7wݵ ~PR[]1,m̘1 .n,C1qZLi_^E<_JMaE24 .{ahB[<  c6G 'WGޫ6^ H#AC4gTR5qaPBEWud,~sLѾ^ɗu3M{gHh t@xlz!oggm!FH- No=ud_->~W&($}3^O설m2 m6IƼjdZL.4ih\Z%hæ[d줽nr  ĆVw]Yʳ:.c{jZ^/&`eD w$I-G*;މ=ֻʑ.ֻi%ۤ6-U%h$Ʉ1B1gVՠfcAҁ▚~uKkuN%ݝ|بZkMD?u2jNi4:9vRR̷p\$(OHAAn(ЅXwKլvW=cDav[T<$wSӚ;ENZ\PyJ()}uI TWHզD7$h4@-Z\+(OW16LbHciwڐmn̮p3M;i(^Id7y#] W c[[{.9DCj}+[;H$뚍4w)I2(3Πb },!0T='i-ͪb|9<&7lFpVMZFK\Z[I-PiV- SvxKdWY 8t^|oVd kOH|qA֦n[,Y];Rh_J&8FmYqv"C^Y؛J7XD⁢[k#<#K'TW,T/*բ铋I3gc((OiPzqd2$ }G<ʇbGڨΗ4K}Ē8 ~Qfтy>"ܾ^E<Q okrmɐ`g$|Es+9. "s2\ Hӂ?aVkۑLţ? dzY#hea /i:Mn%ñ@EG|#xUn⿹Y50|W6 Ȼ7V{ :MP%E Vxo^$c\y)y{mm"!Oڜ7V @94>95ԚQ@ܣHF߁XKd 7B='Ni@]٤5:ΖȲHE9?O>!q!Syh\..}JL鶱ܘI[f:VlxbX{}꾵-\k=C3h B'ʎ)K 'u*em fF`7sӸq$SMZ4ȯ9xRS~]wH6>:vն179 =Ξ1+3}3yyo%DzHdWoM-e?jt&&9fcyt}EnEʹ|0c_ gAnV0[FONBw"18׎׿-m?(/bxAjʾ iv>:£I3Qehe.N*aW'o>j[X]Eh$ƃSgclO>g_u,􎡦#7er SмY[;!8 ڔ!i7*J]λq1AZNƇ \A `Xb-9W1{*uhAg2YHQ6AI GS3V2Uꥠk{1Dw+1Pjwgi`X.˜zN]*NTԚ.'[o9N(oWc;CMǜz^գyZ!-nhTțc$CS@sqnYCU[y^KID6w<*T~cP.qِǑN)hZȟPmPÐh#鮟KXXX'Zzd:t)9eJ-}nmk Һ+߽aݱr=-&K1{8}%qn1r8AoTh8Qd}冟9Vso" BaD#y Rc>%M;MU~)dryqDu>Yof2#@֦fid31lAګCmhJK{;@\׫52YqWCMrrHa;HI0q9(֓vi,ia4wwW#I2=C #‚ɠдu>tBv6Pb奂AoVM)LW I2rT >隨m Uƌ7jt6ɏ r[uz#G-kXҬջ:Wǚam%ɐƪ\]\"l' >XB" JȾ3vFbYrA sS,G0."Gb"o)'JgX}L ybG i6WPfa`m.l#f{D䢜YFpqQ}V]Qnʹ3zƵӴN (wϷkWM:8dq* J5mFK18lF;r=js-]Olg8jͬMN+r(S֌ߣ ' @sSrcBPẵ }x^өf5k'H8ph<首ǪVRk;kJbX^N@мL,.qL, Ή3Wu;V`j P"]^62$ylc}9ޅՇVZ,:,hDsލވ҅H3VA,ǒXrHsAWO^JWE$JeTyŭr ̖sU6S@&S_LJU>'Qt12q aW{UkhV #Br O|P#.k#*ӷK4VBy$R\ɪE$*F)N;,cI.m1vkTh.%鐄Ґ\yKjMn0=BnI"V.Wt~ml>RRSI_0XI>(uk|7eM3463LGl{Uvs|QKow:,;9۴|.)K{VX }x|p 1Y闢;4[,fsV9e'?0|/65W'5^ti4(mYh@r]EmmX~ޣ֣_&W]ljŝI<UF KBcsviz.$T_V)~AJ yuƊ"m.# 9.6afvkVEV9 Z-/K(Y;j{)-8E1rNJgFh.xRu"-,Nk tXt`%3:s{{wMN4h^F('9<~K^ .؊h״1;}YZp 55H߽%jO6yk/q5u0vXv-(1[۷#<]՚F7 6$_eD fK;̘Gޗo賈JTHD@,I@ RSNB<,jֺm\*p|z;ť,bX4scqEdaAgws=-ܒF9Uy7k 2J 8znd{L7n5_<0t=(}ޭe[9IO5}?JﴺAܗy,fS߷݁(+l%W5_-COvGgN8暬#$`q.rp=K^^_{T.svP@1⧂=} ;H Ib>"߫'B/Ztڛޱ[)Zo$> gyxpcV'3[H$1\ Hbi`HG$WW RmFV%y :~l:Ӯ).pê``R^q=zю]"H\ns4*~էmy`1mN$n{g#QqsnPfQβcc(XD1F/3:tKMՋnC8hWr\i̟IU'q$к9 ,w63Nc7;Q=AqYDt>)!NރKM8h<ւʨҕ?(Z-ZSEVL9ku" V8@=mRK,w a7(177[lT}OV-4*. nG>ݽ搫/8;?U SP+}ifivF.N84M֞,%BCn0+:ѩzm<R6AVsY⧶FHz r唌1^\^TiPF2qLJcI?<o_1AZnkҧ1: zm#B#擥y&cڗi@[څtɭstdN/^藱n(JSuso3g@TrTg[_YW:qY彪`bXxDB,Q|E]J9kids景#S{Mizӫ4 kxtgC֘tmPӑEBFo.P] ϵ\-4n%Z*YtdC5~Ꮵ(}PYڬP2,M 3jf{<*bƭ3ip#)LqiMũIlgGST]|ztHۅ;Y k.`OOcs4 v='A ј sWޚ ա(G0C"K0+tUXM$F}3MKHx (8htQiN^[yv$㚶uHIr8'ۚκDkYNXQ|?ѦGuZvn`Wqo?J8*VH "pC\n@\/tΟs-̀(֍Zt}N99aVӠyv0s6mJY(n!aeTiפ4 Ƞ+CU=WT{KA"?WUg@F >ܫBPYbSE MdvV'Zvj,c0 [>2(ݽDcqϗy,J֤>F;jJ2WjҀ1!QrQKs?J&=juI|$6K /%p3_HX Kª9:%Ch`vAsAjUޕܕH` dYN.DaW=t]g平[ 2O)lǺh629ǵxw3vu'Gn-VRU.(4ڙ4{UF-9 Iq wYXXG4ś#Ӂe D'_Z=Xeb&aiZx S+b + lV 'xg;/qNRR:P8Id݀dlsMdvZ%) g1K-LӮ$mel@F}/ f%A0ϊ{zM"} zT[8r]z]>Zqs g>5 H&X[ WotD$.2w(_O1ۿ,P-pLY! C\vmBPӚvb+oJ\ܭ gd0$n]+5sm 2#gvV@\}qWV s'Bzru7ù`SZB _W8 @\cFc!nj[Y0Chu =fr9\qT+9m\ś>~ƙg̠U oh#2G7NǦ I);|5 uUEvU; #@ ]@KF:Iku"fL =[Ou 7&=3Q&[6($/tmˍ˃`--#.f`23NdBBӶOooMec9DHsl\[)K{e3pOM?b9#I<)P.=WDyGd* 6=t&c|L2px۷YI9>.sm cBOj]8K0M]Yݻ!C+A鋳i;wrsW.IN)5!V_I&e3 (bT ޙaكM4[qX2Cuhq[߆H\-{Xqrȧ׺=3\+L92GZ]F")cAv'?aAjK Nf)qO{sҍ̦e76d$nenҔdjAI˧ZscϷ4GZoi$Q"Dnj.׺蕳R[C;+ޝKۼ;}h%ֺTꡛDNԌϷ#W֪ I@;l;w)%>~ӧ[m"*B9^(4u+ \X[iVo FK N(`eV yUPdއk}5Wo%2V ŲImd}w6s;Hmn1@'Q. cF)F}Qx{y#D=[h(9(%OH l& .@@KKBN|շsM :h٦v.e$MQ {$3ma5pƫCXcSTiљwUCw8B?W&;f$oIKtƲ&3:|R<4$yP׽  >ٻt1Hx4o5kv2}9^vD7XLoʪ9-PPց~ d7RX* en }qG4Rf"LT}*Fٖi$o8&Ʊ6| #'O[U?0 S<50 ƸryϽ^TgTi5SԠ7;M`a]Iy$DE`+{%mgjmC ϚwU]i)k: E)^FJKSXn0aJ\YGYtRt~!wx=ԝh4wWҧRCit:=JA_hh<(Bŕc4oPx(*f_iGysG)[vඹ=f )joէԭ[4#I$DRVSL&Oޜ C#%3<S_n*p׺lpj+HO5apg-ZLiG~.?TnŗlZD+wTm"AB-OQ HehEޗoJJ iqv0\> =9 Y  GW[ nA]ZM# dj)jnބt{`nXU9EMaw099<{1hmUwl܊{⇀8oZ}YHcbr}zZZ<,]O qmvo`TWWs2 b4q~JD06Mru'*|Q+>N X_ӺqXJUX ]RHVi%fL:/N܋19yˡp #(Iq3EdE,h.@ϚtJu8zN0+ԍ1x=ȄiJi_ mYKm;@sJ!A5AHmUD cZ pڼ2Ǚ@!s\hv[૒Ӗ ͧ=@g]ɧ+ Y TyV/MXo.'F?;U K-)eU6x 2O/v,[{H.e7`o!sg?-ug*;4ڜ.=҃1:n\41FqA/t{YpcbmCiHr(zyU[?OPcNP.##':\{ZR`ߵ \A&T`T.pjAm xʁ "(G4b}kNMћlcRT}志-԰nc@Ys+V/mZc{Uʆo:6YO(޶dā8 @>QVbć#=1n;EEПN*p3@DdiQQ n"x6>yD"U y񚍢1"~4&eڽhS#ޠ#8ij¸,@҂Yl`Tj[$ka#kxɫ딸(3 Og.H4nבN fKᇑ5 iK#&b4{;y_jt"BTaGxYX *X,dXql;۪"LM^v!{V2,^Pݳma_95byS>~d&2.`s*v8lU41+15p2#AArM}Cp\@wl`j̇Jh!p[cIoO}3vGΎxSuqkstՁxKǐ?Anx˒>­Qk= lU`'Tzx-1zݕ#4]h#nJ̹MҚ8'FP9FFHGsI> eoY^ce 1qLUİդh.#LNx?sްOOچ|2cD S[ۼbvX'ɯYA8}9^AyޖD¢{l4`I\Bɇd@O$+#|A[Kӟ{jx lP9'ړ<ѧrP=/|:;DYU ||?gpc=$RP kE+n@:McRp@#AV{Af.d[X_A^:j"2]XlqIuB{ngjD2D*Ӭය-=H-AN}OP9 <~*I"=,0_|3B"9$5jMvdhm6X}KDR!x$m>qFK-U-FzΜ<}e@ޢ98Ν-v9$׮1 C![LB "%N%Vפg0eP)X۾>Yc$`O4}*㶑X( 4(m@FxF+`23(+BȨ缁¼sEtldr>oG`,ɞ#Ѥ\s{1?h[s_-n! \w6PK(5v7lE V[Y[p ojX4صFQV"[Vz]hȠX=ە'r,$sjzOal`I.jk4E&cBYWsA^tխԞ@PqE&XXO ;m-M'8]2̐ acsʯ/ÅKc,~(?]'IŁNG< C2\R9:t&A>;YG Ͻ0Zz2[G,Wf)5PZv= ,$*pjlRJ7C _]J4zQVY[ W2 Q28'Nx`F*oW%i=t4H_R0^3TͫDⳖ2F}" ;)Ql,$coր}@F8䐐_?^+!=ɨ'NI -T _P!f}=F|> ѵF\[H{YP' /sX?B4;?qEty] M!O$Z[dG7Pm`\C/eUs(7)ple_dbF vev3R|B(ŸNI66:$ ,PI>]D͞3_IDc *WEg< M*+rI5nU;L3c*ЄdH>EԴ2Jb AyVw cUe4L(O2J*blہAYu7)ֲjb2@r}k v㸷L1KRҭ]f$l(=i}O:FmS\D#!Ԟ@)zniԝ"Zuk"2!32% Qڹxxnw*#t9«qJ$-р#V-8ũR9'3]OqARkYP@iB̿}hZB,8$3P6aɎBy (frhIko.{棖Ĭr<栶^ȝ9J`A+ wG(<Onە|Ҭ_"/.P3vL>;9)wZ8&2H *ai%|(]Fğc^(qRyW $EJ x7*4.<f]=-$˳yޖ;D9n$ \ ZKy]#[V&|gvu.HW -^O[F1;6q$8!Aku}F{{b64($1 H.fX+9h4;aek]B޼ cjT{@?֖WDKK9ln6Frz[ԙHoc"SU4&9.;-#9?9bDiyQDZP&㌶qApU#*ZXupGК ,]d,=h P9jI@g)(oӾaIR+41LDm<?`;dڀqUn݉,S_D&nzs9Ȋd悗mZ8c,}UWa1<*NHݳ g7Qx5v(%W()Lgu9j P PǼBʃ)ݗXDFUbCqWҭؚ1Vjc%eU^s]4o x* x>NE;hP-Gp!%+\g%#R8k} *sT,"W "+Ż1 %l+eu@eW|Ԋ K_FWնf6utDջ켸 7Xs@+Ľ#Z%Wi=Ca|-FS>8{/nd2Lqܟ֯趲LHvyݷ [u*ln,r!$IK!#VoeEґ^h3&˘c0c6$+I$s28Pi[\vìd$⻱pNɪrR%@V-p j2~, ݏj%0$"!Bh9kb03]@jipPS<=RY\͜w` G5nI.9MJڗMu :l:Mroe>UzpZCnua5U܀[dSb dY|aA#l j@n=sAX].eFAU:uݩf0 TAlsQaK$84 ~XyzZL?a_HHS*(hˇ@B[HÁTKia.ҤЋ5r{kYc,619P@qUMԩAۋq%x^Gpހ#c"W$^71@l`Y p{Wqd|"%O8ځ9' }^D8G!&Kw@Wӑs$)hRJmMs%-@ϧBY9-y?{y"wS皎X;-Թ#$E߸cS(kxh<@?XRߊ]9*?ZQ0~?P{tc܀d%qSg:Mjkta\(4[MPVir HjIC%Yʣ4eXK~VPٯn5=l4-[[Wuĉ%F3_Owd;sh; &;7m̐@+nGh9le!2a1aoUP7 F`>sQ$0,lRA-^F;84\j4.mX}ʹ]ZDWS+ڸEԅ ZѴBm f4"!i}%;\*gё}C"uef-т~Ρ[ܢ@O8P뽊x팰xJlki`NsAEe26⡼Ӿw h{G*<$5I<f+ ={d.k}7L[8ϵb ]Bz`{d2Ej|( Dm5IRɮ[*!O~VM4THpOҊZS2A!vf@}MGw,reǶ+yf0Tˉ8.bgƮ$c{vmm NFOc}\S"m BsZͨPI" @?[Դmϰ[陵;^L#F*h7xD <`T1NǃAOFndi/G9m]0ni|R.fiG=?zZ yfNp@~v}Ž­։[fN@]٣.3y,~Dt}ŽݬD?IuOˤI$_L6 OڀJH|WA, b-#2,iBy7=j:-]شa턘frH}&*Fv怢cNsqmynUZ=dr_qASЕc52]nj -4+^E@ 9A0ـ8*[j9Q漗V$95$Zym''YH'+&)gf$gމJ?ܬW4*Ǖі$ew3cuDŷzO07:Vm&dsqnp~Q)Āl! }*VLA6>j>GpO6p\+[K#ڀE_#kz8SsPVQOS(?LGr:gh,ſ\+Ԅ-$M(#jLsX?8>fu¡cn*H;I$d})r$ | |y' =ܖ%-#m>9#U89%Hv6>W6rǵHRNy'5/' 5JL~+qA\i" T$XU#y=Ŭ\6v,#.Hjm\'\"b7*ue Ehm`d!ٕqhIb֠+m}Vw}%]rjw|Bem[(:UO[m3FGF8X܍k[5b#F-*("Uٺ@1EVDyٕȭ@->i-Ay.dSi VTԄQgQ?M29bv|Pӊۡ7qzQuL e?QKc39'G^ma ?rh1Vxfue]GW YT@>إO`K>NZd쩌SUw(ƥ/U`df~_7I8!@ d8pkX'4(EIN+ ^HGDc_{W`]G =֡Nyxdi֗nRE{ٓyU},c;TzW<+.^ z}D}PjG218?T۱R=^W<[rI{# V0ZA 5ǫ-v!$m?kQnVM=CU ;x[O T%%wmUc64ʬ)'ށMFء¢+g&lRQEC3.rGޑRgaoֻn0' pj9(K[47ےH'OT5ZہX3 +MWRuV]vʛ~>>!kp=O jS9jڴM$ Z%z1e¢h1MuԲ+]#/d:[j*hs)j -m %235wN[E:mW:GamhAɌ AǬ`ڻں1mоBL  hlʉ ~{MOzyle{@ϵk6Goh g^9cI+l1" "HYT>'@d7jCR&cd.n #tlY'j[鎨ҵm:tK(û՜F.$XU F@yUJՉ5)"T\0G! 9xWU{3\>vn!d<{=B8 -,Ò[Rm<ڒAJZdvYA}*1 'ME<|*+k @ F(5ԅ9fm0A֑pm1b>IytSJV`Gc'HU/㹋2@ۼ{P X-#<]YM6I*w/ ǀjj;~䶂DWVURdd-m-9uF~N9sTCT >UL`=Kq8g{+c$X3 qQ[KpClP>j3>մ_w\|P]H0Zq%}Ay4Uq&LODtFɕ;O M!c?O܃3f.QTRDZ942G32p7@6l97XWuP)=ԖMr9ɠxG^[jrH8fFHSCnbk"g?J~Lw3K:3ϵQX쭒 95%x ;[ VPŁoM<ȩv1E*\kM1:IW1v6*P xB-m;H$p<ۭNHO'B?68R_ܶC a4 Z6(d''kR'P㳂ClMFғ.5oQ}sށS֡YC!xwMVѦDaDڝݘ"::+qe,;xz PY om1_lVԺުXZd#m )MҺTcMk$0F'gKZfDAaE]+i$"VU$v|z8oc Q}y \ܡTypk+ 5Վr(P4b ~թC*3H 7Ll.HsR ǭ(w32)EP0%nX|=+گC趁ZE}\61ֲеqخ]qomǸ}Sv<:{DoLQہe v}LI~..ow'YffPTޚxܺ?rj;vֿr$%jN_Տet-n6&1kֈ 1$gsE(Đ9ug:{,[4rE#޽lJauApܴRK~pJ 4]t.0ѱ  l;o|w3BbVUaE0Ip+(Z \8IATQ qkqp=];PicjRZ! AIJ8>$O1KuYC0'!V3[6Il +% O&U4ඉ"YJgP YnnO+ma]MY2Y՛Ai9dT.M yON5{wP/Gބh\fRe,}Xj|҃>H< P޸^JENswc>TW:\+t$2n#rzwRԝf DǵI^[t`T`5J;+H1~ 94KN3%۫1%W}q@ RycZ֯+F]dev#%݂@X|{׺O >-.,nmI' )mZy'&d%bOI!Q$8 Ghֶ򔸔4H29"#Sj ng쀹݌;>{.8Е"WM36GC.yGޫQ-5_::h#[f!QwEj"$a?ㆶҲbS& jIwQtug2G$B+eoT+IV1qI9#sGzG,:KNdE A`"uGBE%ֹhπ&P Fm| $V26ɓ*O w OGYw(+˂y悡2JPhna֍+8ߒ21@ =LE",+FQ\h'5(2Fk[I>т Gr;,}We dbMtlIƧYs PQil#kԶR>Zbps*Yp9J=&dYFq`"9㚈΁ez*E4h153R 2TY\Bň$2i7FXtP gOaπ*9c2m?ZwW2[9k'bȿSRv7D,x*7I`3n"n$.cEGǑCo]&"Ì/ZKPU5[Q/Q'jҼcoވY42FI{P)mnn!J<h%Ɵ ?0CZi ek/B_8hCupZoE #?zm*oꚥGҁkw67lĠAV$8ėN63yJ ijp /Qp"く|LO./i <ڕXe{sYH@G\m>C˧V#yBfcvC8(mb!uhY#X9>&mϸT WVQka#)0З{ jF.ix%O1m!Z-k~ Z@2d<}+wGL[jr& ry{׋$WWRI;;Y+>_9MhU9FPW43mO4pb݌+6M>Kv.s1c5-^Oeg d Ov&sNqM>hlZUF6=vc=ܯ( 885ukf,u|_'}46ܜ5zKtV5rT~]m`y}2!I$L1 8ΫZ vA`df~4I"C8?֊su%PC8#ɨKӗEyPiSgNs\E{33C|cKzݳf@8Yk$[i<SPY @ہ]GP4R T0c+a{4Ωu=Q"<[ Y{ cۜ yk~1̅$;YmY}*q搴5Bu(qYDSˆ Ƹ4 ˬ̮@=kU8_ҁ[钉 |r(ZXA&Or E?⻈^<y8W-7('9s|/(ǵ,w}$yDl`\]b&]1nIU3If[@0dg?LCY][Qs@W\D>2dž%q^7SjIz XnKQq?sh\1{i}n%K_/5[Ƹ[rpT1_0gBHX= ԰ ,AŞJQPϜ;^p 8_cJ:2Mmqkoe1R[E/ wI$.u`䵑8G 5.}>_C1gnlriqn?Cn(We|r= Un:PFGc'!q e u~x@'UіCC'}k( ER @^G]d9bSQ \Aܒ#A##;jf>D3r?2 R3 rqS皮c.cd]7 T+Q҃b$mTzA0&i-{YGޤz@~xAUv3I5@J hJhW1C}+Sy#OzQbp7!\1>Kaa$3,+ Fiu i]`y>("AaeX 7:ZyekϟiTH.EEanW&lgzOj\ >{cj6XZ zE5zrLJS>ϤO+=WQ |WOFKfE|ڂ?Ij[2GIk xd7>ŧKn $RB. 8<kB^"bJTЭͤ31E{1xd$p'={β2*.9]9nK:x@}9n={Ln2T2 VyY`8/ 9}1i5wAH.L<<)UuX5=_m1pDaAJ6[Ǵp>rhΨ yҍj&7DD5'LNJ q FimkEpYẸ)OLv=-$<2i+HQ&u O 1_=Ud v1_s mKҗWX²Qh4m.AQ;m>BOU  )oeė23 S8x`_;O>_!7*Ω[X9 >j % pl #&t}DFZ{^FU vzJ1G=ԪӶ> ۭcS`ҩߴ@o>ᵼsP{xS\FO0+k{O;! F1A1DZ+1\}bzf2, Ry5m}nN*m Y9g<*@_s@)a4Wi~BIYt@"nߟړ/s,YOM !2;&ҭzf8]cXF8M@jEHǍԧ.c #Y#^Σ&o'75|wCkT/xKUd]UTB(I:;c`( XkC4J )nϰ qS1I}xGQ4=v!s9G{н'T}c v |d@١[@(gS,4[1'F?!GvUI(%SW3)@\f'l[;IئG-Wp{&όwŋ 4ex]?ڵ=ܲj8P(Ik !~[^<F. z<G+@5 Vxm{rIפ O(gu RMpw }"Ёs+L#VYehFy>=Yo6aQqqwlID]9ɩm;飸41H-j8́Xh'avnldk(V=,o9oP-V5? @`pnh-giqل9e,U=fl3ԓ>E9R-/h !`D{{{URf;ЛGdq׺X >P1 G^ZT_> Ruޠ҅PIz\zft7UAk:|q;w\m>₦ݻFb@̀{cjuT KAzfԷ(@հ \zwu&Y#><K,r^8:a!%}Jhݫok 8:NӲ^fIQҝ^ H;cn~CIs/w&XJ@}RKŊ{hH%MtMԯu;dP.9FOgqfp0meno"*vPCk[V5DPd.r|sއ\j71\B!Yx6_L\:`pƁ]zW@0^犎\֗P r3eb*;sUtv]E(qc&bzP[]+tAhҖ;( "XGpL21PCa\E8Q$#`4ؾ(^fX(Չzr#n]H)b/ 8=tm:4Vu yVe-F$dXlry,:OUɧ63aU[pQ7RgR<F0 8^N.`ȣڽ/&[!OEy]zЄ! He{5 O=Cέ.(z'xW.xTFu] GgIpPkVl4nY179U}bmHc B79qGmt)kZ$IQI1*@O*wĦ@$cGݠ`C\Gq皿-[IpN8+*f-<='T pE!KP򂾗\htZ,A"f/'FѦ;օGs /d:vc#$S5XX,),7PxHPH&c=,:YഉEH>ڳ̨n[wv mWmFڹd\ϩwɶؗ*JJ F#p qwZĊG F¸] ~yWX#0 ncao=Բ'#u}s=f ȏ<Piwr$- *v Τ 0ybfp3EIe./呲p+Ѭ_,S6 *NIEf4@  <)&DFB}S6=)KF"POڃo22=GK7Fl4}!\\&`U/ Ji@xށ[NUU]3 WZ O#hg@RP-o$10<|ڀ{]Nⱃ-rx!Aݞ#Sm45Z5d;x>e`Z&Bɞr<һ9,FO5CO[.$,p(!NWhGeGZj+r."Ǹy8sV{YnoPXKhc"^@[s1 ~`kSq?&{F>2YվtڤQL4!E8 NR&[l*o95Vk7pp[{("-W1 ن6u Vorkj]UϱJXKn6:xLsi/%մ?Qh($(րܲ[75Fd[$Ly,<"d< ڬM"!ߎMzOu8+% |.#EH8}j=U澿#9E[A]B=% 䒾iֶrB;F=MU73ۖ9kD,Isgxam1 ;c5b-Ci.Rɵ;ck9ul!+Ff jŮQ;r*z4jWr@RK0*7)Ⱥt >UWT o !_Fڂ^*6OoB"Jrq]RdlTwz\ƭF>(GO1 }4'-[^B 8;ċT~!%_ŸdI,xg{h:|(Q3_ZhBY%75Zް4]vݟzdgVtPcz$#"W+k1y$5y.- 9^~A+9{ Ix2 $Ջ|$PD;T#yi{rvt9vF GAJ \&Fъ.n 99QـG6sī5F8Vl`,U#2cSX#be221U-b~^hp^=P^GSoy>Գkcc ڀwAs{tF t-wH~׎R=,[O Oo9uG 5XiѼ0dBM tw=s鏚1 y1 ۞啶͑Ndx-$C'} Zً.p{@f^;A .i6"CxI<)F!D@ <qt;mUi|@)a$rHw*K\IgoS|i~#$0r2hHHP@W5U9l@k@ OO[3!}2`UK(1ǖ' ȇO_aUKQZH8(Z}NyUFNF}v6pHY&Ƚ >Sa}u0[ 5xYȲ wܧw65Ɲ{ѡy| 9}hIcQ[t-b]pP]/yD\RqjvVEcd(P Afpc2~@ kxZw@G/^o,2 V\E~uN.)(Lr& +5}8Kq@}r9n=_D,h u"9Mx6g`MMSOr7; E> 鸷vrCdlEP!0;BAG XZifD$}5Ie?j1e-nY5퀞 *"(#Z0ӁdsqڍI<#/f^1wh\pKf\+[rہ@b-%noU텳^"yR4W8y^4;H;JrcuA Ǩ~(+9suʄ'PlD2wa|ЛkMzN,'0ɢzvg%$r1e\"[465ݧP*dE$f>HRHPnPk\[GML8 1@vu0"?TC1̋o4ҵUc-[Kp Pxf毫Z#l98'b>|Unʳ8do&V鉮*."wvIeS!Q+G2n$mW Σ$/Ow@/&#sz֖71*Q8ȫdWzwfL *VUKC(yt^M"oxށl=Ab6~:_[GF9 ѣ?lTR!9>&9LSQHy!j9VXP7ރj\$J @gW/㵂Ga2p B7+$hVjW#|}R†v<$][ex`OSX, ̳4x P,Heh;+ZYt[ic >_E)"䬨|{[Is zL47@H1>t)C67{׏HK̪BP K[ [;b (D geEeqVeQG\o@FP %H(8Py&IbL 01DΑneYc95ΖIT@1B/8'5v;{q(F|ջ>fbp(>|Trʗf\qs6H}@91n&xvH$]nD@}.ϱeXMo9^QB61f];H*9x! | PSM^D4{$95. 4{}Z8f}0|W ޥ(]\ctL)c*W ϜpᇓVR+Ns8Z(@cY%ɠ%x }ZK9T>:" E<ʪà@x?5B&iO68>,ׂI_9)Y`CۿQHVHldc 7_U>ړh q'Ֆx'g P1vX̅XjIp' {}9UǵKmYs9+G8c\Xʗ+#\.(r>R Hϑ^E L4wkoY1n+푌Fer[@ԄWOn%`eK'ϽUmRRшt-X9G?j^ hi19 ۆ=-aTDXz%h{s}B3Aa05Xf$Zp4Qju4ӯk0'ҖR>ƒ Node-path: trunk/prototype/data/images/background9_cmap.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2387 Text-content-md5: 01fa497266545b7efdd368c70ab19dea Content-length: 2397 PROPS-END PNG  IHDR,gAMA aPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~2 rbKGDH oFFsuG pHYs  ~tIME %" 4IDATx[EQ>],g9[92Y, AwᄌkUgh{NM{K8% T'J>z"ux/;{ށ7RoAU,Vz{] }'{7a! l^eެ^%.a:eXzpc6,PG66L0Yػ0Q5ꍘFLTuz#&A;1IֵꝘRouTb:[[1Tvb7ktu:ct{oӷf6kgűmN#ϊc<-8-8/Mӷ66f|j#os ;aƷ66+vg)f~Zc]1;Vqm}.ǘ+L+7X+b\ 55?JyWBi6s lG%s jG̮eO[\2 V>}oqZ*.F\VunPO uUWGb#1OUꑘ'N뜜IɏI T78=J&'@R$%@R$-NO I I~;ZݟO￾ˉ===W@nz:u{="7Qo>y՗<P1WzܭN>z ˃wc:wc:wc_P1=EC9ݪދnU`uPb_HQݢފ)ꬮU$uXתwb@q]ވ긮QoD^Sy[Sy]V/uf˰De2, ՛Pۛԛ7Sbup`:P@z"og$ ) ?-Qm ԟ_HJGJ2I.BHSԯ0HJ~Ho`HJ>TGGJHHoHJ~HJu98]HJHJ?LfZSIENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 4755 Text-content-md5: 99fa8f2980f40f75ea0f93be5c5ba9f1 Content-length: 4755 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); background8 = data/images/background8.jpg (type=surface, x=0, y=0, width=640, height=480); background8_cmap = data/images/background8_cmap.png (type=surface, x=0, y=0, width=640, height=480); background9 = data/images/background9.jpg (type=surface, x=0, y=0, width=640, height=480); background9_cmap = data/images/background9_cmap.png (type=surface, x=0, y=0, width=640, height=480); // EOF // Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 6684 Text-content-md5: 2bb0685f08f78c5573ef41f433409a33 Content-length: 6684 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (dialog:add "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (dialog:add "You see a broken window, looks like you broke it.") (dialog:add "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know how to pickup this " (name obj))) (define-method pickup ((box )) (println "This box is to heavy to carry it around.")) (define-method pickup ((book )) (scenario:remove-obj book) (add-inventory book)) (define-method pickup ((whip )) (scenario:remove-obj whip) (add-inventory whip)) (define-method walk ((forest )) (println "You walk int the forest.") (scenario:set *forest*) ) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (scenario:set-current game-scenario:outdoor3-bind) (set! *current-scenario* game-scenario:outdoor3-objects)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) (println "Scenario: " game-scenario:gateway) ;;(set-scenario game-scenario:gateway) (set-scenario game-scenario:outdoor7) ;; EOF ;; Node-path: trunk/prototype/guile/scenario7.scm Node-kind: file Node-action: change Text-content-length: 865 Text-content-md5: 71195f9dc2e0427cd222d6350214483e Content-length: 865 (adv:define-object scenario7:tunnel "Tunnel") (define-method use ((obj )) (set-scenario game-scenario:outdoor6)) (set! (adv:bind scenario7:tunnel) (advent:makeobj-empty "Tunnel" 26 97 100 121)) (adv:define-object scenario7:path "Path") (define-method use ((obj )) (set-scenario game-scenario:outdoor8)) (set! (adv:bind scenario7:path) (advent:makeobj-empty "Path" 336 61 130 160)) (define game-scenario:outdoor7-objects (list scenario7:tunnel scenario7:path )) (define game-scenario:outdoor7-bind (scenario:make-bind "game-scenario:outdoor7" "background7" "background7_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor7-objects))) (define game-scenario:outdoor7 (make #:adv:bind game-scenario:outdoor7-bind #:adv:objs game-scenario:outdoor7-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario8.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 629 Text-content-md5: d67199305cdb62cb04313404bd4fdf13 Content-length: 639 PROPS-END (adv:define-object scenario8:cave "Cave") (define-method use ((obj )) (set-scenario game-scenario:outdoor9)) (set! (adv:bind scenario8:cave) (advent:makeobj-empty "Cave" 300 170 390 120)) (define game-scenario:outdoor8-objects (list scenario8:cave)) (define game-scenario:outdoor8-bind (scenario:make-bind "game-scenario:outdoor8" "background8" "background8_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor8-objects))) (define game-scenario:outdoor8 (make #:adv:bind game-scenario:outdoor8-bind #:adv:objs game-scenario:outdoor8-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario9.scm Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 401 Text-content-md5: 394973e481ca0b32cccf3efdaf64d367 Content-length: 411 PROPS-END (define game-scenario:outdoor9-objects '()) (define game-scenario:outdoor9-bind (scenario:make-bind "game-scenario:outdoor9" "background9" "background9_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor9-objects))) (define game-scenario:outdoor9 (make #:adv:bind game-scenario:outdoor9-bind #:adv:objs game-scenario:outdoor9-objects)) ;; EOF ;; Revision-number: 24 Prop-content-length: 157 Content-length: 157 K 7 svn:log V 55 Connected all scenarios and did some namespace cleanup K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-13T20:59:00.000000Z PROPS-END Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3081 Text-content-md5: 3aa4f6716d86f0dbafcea3d355a2f418 Content-length: 3081 // $Id: ScenarioSmob.cc,v 1.6 2001/01/13 20:58:30 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; std::cout << "ScenarioSmob: adding object" << std::endl; std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/TODO Node-kind: file Node-action: change Text-content-length: 241 Text-content-md5: 3cdef433dd926e3fe0e15dffb9c92737 Content-length: 241 * handling of object collision - for example usefull when mogli should automatically brought to a no scenario, with out extra clicking * handling of animated objects * messages and dialogs * timer-callback's * inventory manipulation * Node-path: trunk/prototype/data/images/stone.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 7016 Text-content-md5: 6df8d3ccb1cb7d80ee04ce2032e56560 Content-length: 7026 PROPS-END PNG  IHDRV[r)gAMA abKGD pHYs  ~tIME &(#IDATx]m\u~ܙsk]VI؍j,Ӵ\S,qCDq> "CHBP@ mii! `B)+X+̽so>Gg։VJAx=syyů_~_0 a^^NzF˼_2z۽N:!x".^>0`S< la8 KN㽕,v7GуeɶwZ V VKWeHTm<6z{J$HTlZ<V i$I0L0LP8eًܭq ;pxeee.@Qp] q( 4Mxuh4`YlFeȲ eYr_|u{< i4M)m0 qc6,4Mf ۶81$Pbv냯zG.<ϓ4ͻ^z饏KwļbyѹuSf& LZ緗{#a WV7DRYƧwubϣ8zD fs8Nn/x0 WVJ]U_JR0zZ&)=epy0lu$IāeY&Z+cNV_ .-BHT>"keȽv`mmԷU_{,iz.V4j$~^Q@h6>49fjYl6qX%% X^[keh4YmSRQ,K©z.i+A0 {~{nz ͹YziZI c]@SI%r)_肜[v\rM,Ei ,vVCד {Xe`dttSu38۶A'pX'NpOvjgT$2d"rk=JL&o@Nr߾}RTc#zgK'eJK0ǿ,l6xʌk+P@HTkֶz$ I`:ʖ-I\<-k4Mm,--!gY~yp`9)%12`84MDQ dj4a,,,jwX*=3lڐd1Na,p8ʶyÁlLpLgdhq#yl6>.$ݍXV5 \."u:em&z6 [n/}[^^w6(T+di6ŸtfNmj`lt1~#u({;~|燿h7b0M4s23"hH$`6Q\;>(:{N q>Jb@ H -u,hNܬJPv)|ӹ}c\}P|zGwnZ|2waJr)-q$I*L;e1fեvh0 3S7\t(^;'?IS0?A yLh#'mI( BơAQ\K> lU'3'tXlX꯬܀ ݁rvVCex.m4"jvNx1U&ȚsitUjlel]]a 'os@ ,'$ 3#Xuo4< 6:VF8~gyypեPXnJ䖧xۺMjg`Nb7}\>8@=`.n8,fv~,fc[<ϛStK/Z#$)p^.qcee垲,1 ''N7kO"5 ,Y>wG&J\Zs uت@=Ů5l׋ג*3SGH;u4 t+tQVM)a D:!VӒ`caT᭭T ,M`? `mG>aA0ɣ>$HVw4 :utdaʲt: sbRn!۷O"p˲p6^;ևj@5yY-TS\h4ٳgšT haT`.lұ^pDm0ܥxxNI`qqQWX]],rV5[^ZC дJ] ӇJh)wP:0gS#\M49Ar{mWtq8ejՇ޺:&:Zrl툻\p{=zͲ%>P)ѻa\>yV; nmYaii s4pLt\X`ɭc4Ir`v7g:Nlh`Xe۶ܬ+sn̓h, jNi=V;E0$a`,Ia|pH wZ`ԡvsTt2`T?EOC"v9/Ӂ7-X[Vj#eDQh," <, 3;~?YP.Dt*ΔO:n0C-}g84LY鉒ĵJꤳr5Xݥ>u}}](chnM&,5^."K)EQym/V;{^}u7 ۂpv[ݮ ̑}UU҂N ,9}6aeeEgi@QDRSjw`"@JD taҥKF8a W[|=-J BY1С.tTD0lד6kƞm =T7$k&uٶpv- 3 .w],B1pP\0 ʼnFQ$.rV㎠\.Q]C.E!-Vji>< .Hmƕlu2oےyXfY") # эt&Z~.9^/214AN ^x*a$Ir''тu!vG]Y u*gYx,/팲,K'AXaj?s-#;ZpUs-+-ΌpKru.:iόhbp',*Er:3jF8tkvz hjtJIxG@R n} h kuhl&wFxi*뺯/,,^PV.ZXXuːt92a4 ۵V˅1;G;]gh'@XPѝipƗKZ|t]ɓ'k3_?\vZvI`CiqO=ԫ?+ncKlh qIENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 4835 Text-content-md5: eca03d1ac06d1042c5410b1b5a266670 Content-length: 4835 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); background8 = data/images/background8.jpg (type=surface, x=0, y=0, width=640, height=480); background8_cmap = data/images/background8_cmap.png (type=surface, x=0, y=0, width=640, height=480); background9 = data/images/background9.jpg (type=surface, x=0, y=0, width=640, height=480); background9_cmap = data/images/background9_cmap.png (type=surface, x=0, y=0, width=640, height=480); stone = data/images/stone.png (type=surface, x=0, y=0, width=86, height=91); // EOF // Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5476 Text-content-md5: 21c40b1203253dd4426d313ae58b7093 Content-length: 5512 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (adv:set-scenario scen) (c:scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method walk ((obj )) (dialog:add "Don't know what you mean. So I am still here.")) (define-method walk ((obj )) (dialog:add "I am already there.")) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 5989 Text-content-md5: 7aa8997ecd3e60c225f5405f002277af Content-length: 5989 (println "Loading objects.scm...") (define-class ()) (define-method name ((obj )) "takeme") (define-method use ((obj )) (println "Got takeme")) ;; Defining objects (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class ()) (define-class () (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'off #:accessor state) (broken #:init-value #f #:accessor broken)) (define-class () (state #:init-value 'closed #:accessor state)) (define-class ()) (define-class () (closed #:init-value #t #:accessor closed)) (define-method name ((obj )) "tree") (define-method name ((obj )) "forest") (define-method name ((obj )) "house") (define-method name ((obj )) "Indy") (define-method name ((obj )) "whip") (define-method name ((obj )) "box") (define-method name ((obj )) "switch") (define-method name ((obj )) "book") (define-method name ((obj )) "window") ;; Around (define-class () (light #:init-value #f #:accessor light)) (define-method name ((obj )) "around") (define-method name ((obj )) "around") (define-method look ((obj )) (dialog:add "A large mamut tree, wow!")) (define-method look ((obj )) (if (broken obj) (dialog:add "You see a broken window, looks like you broke it.") (dialog:add "A beatifull large window"))) (define-method look ((obj )) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (define-method look ((obj )) (cond ((light obj) (println "You see: ") (for-each (lambda (x) (println (name x))) *current-scenario*)) (else (println "You can't see anything, its dark.")))) (define-method use ((obj )) (println "Unknown object")) (define-method look ((obj )) (println "You read a book full of wisdom.")) (define-method gclose ((obj )) (println "You close the book.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "You don't have the thing you want to use.")) (define-method use ((obj1 ) (obj2 )) (println "Don't now how to use this unknown thing with a whip")) (define-method use ((obj1 ) (obj2 )) (cond ((equal? (state obj2) 'closed) (set! (state obj2) 'opened) (println "You slap the box and it openes.")) (else (println "You don't need to slap the box, its already opened.")))) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the switch... and it breaks...") (set! (broken obj2) #t)) (define-method use ((obj1 ) (obj2 )) (println "You slap your whip onto the window and it cracks! Woops...") (set! (broken obj2) #t)) (define-method use ((obj )) (if (broken obj) (println "The switch is broken, you can not use it.") (cond ((equal? (state obj) 'off) (println "You press the switch and the light goes on.") (set! (state obj) 'on) (set! (light (get-obj "around")) #t)) (else (println "You press the switch again and the light goes off.") (set! (state obj) 'off) (set! (light (get-obj "around")) #f) )))) (define-method look ((obj )) (if (broken obj) (println "Looks like the switch is broken and unusable") (cond ((equal? (state obj) 'off) (println "The switch is on state `off'")) (else (println "The switch is on state `on'"))))) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method look ((house )) (println "You see a cool house.")) (define-method look ((whip )) (println "This is indys cool whip")) (define-method look ((box )) (cond ((equal? 'closed (state box)) (println "The box is closed.")) (else (println "The box is open.")) )) (define-method gopen ((box )) (if ((equal? (state box) 'closed)) (println "You can't openen the box, its looked.") (println "Its already opened."))) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method walk ((house )) (println "You walk into the house.") (scenario:set *in-house*)) ;;(define-method walk ((obj )) ;; (println "You walk out of the door, you are outsite again.") ;; (scenario:set *before-house*)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3)) (define-method use ((obj )) (println "You use your whip and slap yourself, stupid!")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (println "Scenario: " game-scenario:gateway) ;;(set-scenario game-scenario:gateway) (adv:set-scenario game-scenario:outdoor7) ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3095 Text-content-md5: d1c9575fbc0849e4ea39b1614cda2294 Content-length: 3095 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (bind-obj scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") (adv:define-object scenario1:door "Door" (closed #t)) (define-method use ((obj )) (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (c:scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: change Text-content-length: 1608 Text-content-md5: 795c3c809be45fc1daf1619842d6e501 Content-length: 1608 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Objects (define-class ()) (define-method name ((obj )) "plant") (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2-bind)) (adv:define-object scenario2:door "Door" (foobar #f)) (define-method use ((obj )) (cond ((not (closed scenario1:door)) (adv:set-scenario game-scenario:gateway)) (else (dialog:add "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed scenario1:door) (advent:set-surface (adv:bind obj) "s2_door_opened") (set! (closed scenario1:door) #f)) (else (advent:set-surface (adv:bind obj) "s2_door_closed") (set! (closed scenario1:door) #t)) )) (define game-scenario:outdoor-objects (list (bind-obj scenario2:door "s2_door_opened" 236 247 0) (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) (make #:adv:bind (advent:makeobj-empty "NextWay" 0 260 70 220)) )) (define game-scenario:outdoor-bind (c:scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 1413 Text-content-md5: b152d084e007f3396b965d0b0d2b2b88 Content-length: 1413 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor)) (define-class ()) (define-method name ((obj )) "WayToDoor") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor4)) (define-class ()) (define-method name ((obj )) "plate") (define-method use ((obj )) (dialog:add "You see a plate")) (define game-scenario:outdoor2-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 560 320 80 160)) (make #:adv:bind (advent:makeobj-empty "WayToDoor" 585 260 55 40)) (make #:adv:bind (advent:makeobj-empty "plate" 210 300 40 40)) )) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario4.scm Node-kind: file Node-action: change Text-content-length: 854 Text-content-md5: ae97caedfe7db016d0a556eefa96e35c Content-length: 854 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (adv:set-scenario game-scenario:gateway)) (define game-scenario:outdoor3-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 440 200 130 140)))) (define game-scenario:outdoor3-bind (c:scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1611 Text-content-md5: 7429ef6fde54c3da83fa58c89a0c6a9a Content-length: 1611 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "console") (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor6)) (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) (make #:adv:bind (advent:makeobj-surface "console" "console" 250 398 228)) (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario6.scm Node-kind: file Node-action: change Text-content-length: 888 Text-content-md5: 08517724a554f9f378ae3fdf972fe7c4 Content-length: 888 (adv:define-object scenario6:tunnel "Tunnel") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor7)) (set! (adv:bind scenario6:tunnel) (advent:makeobj-empty "Tunnel" 425 240 125 120)) (adv:define-object scenario6:village "Village") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor4)) (set! (adv:bind scenario6:village) (advent:makeobj-empty "Village" 0 80 170 320)) (define game-scenario:outdoor6-objects (list scenario6:tunnel scenario6:village)) (define game-scenario:outdoor6-bind (c:scenario:make-bind "game-scenario:outdoor6" "background6" "background6_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor6-objects))) (define game-scenario:outdoor6 (make #:adv:bind game-scenario:outdoor6-bind #:adv:objs game-scenario:outdoor6-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario7.scm Node-kind: file Node-action: change Text-content-length: 875 Text-content-md5: 5ffe516b84cb7be9cfd34d6731787ba8 Content-length: 875 (adv:define-object scenario7:tunnel "Tunnel") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor6)) (set! (adv:bind scenario7:tunnel) (advent:makeobj-empty "Tunnel" 26 97 100 121)) (adv:define-object scenario7:path "Path") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor8)) (set! (adv:bind scenario7:path) (advent:makeobj-empty "Path" 336 61 130 160)) (define game-scenario:outdoor7-objects (list scenario7:tunnel scenario7:path )) (define game-scenario:outdoor7-bind (c:scenario:make-bind "game-scenario:outdoor7" "background7" "background7_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor7-objects))) (define game-scenario:outdoor7 (make #:adv:bind game-scenario:outdoor7-bind #:adv:objs game-scenario:outdoor7-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario8.scm Node-kind: file Node-action: change Text-content-length: 860 Text-content-md5: 9af767673448bbee772923d128de9f04 Content-length: 860 (adv:define-object scenario8:cave "Cave") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor9)) (set! (adv:bind scenario8:cave) (advent:makeobj-empty "Cave" 300 170 390 120)) (adv:define-object scenario8:exit "Exit") (set! (adv:bind scenario8:exit) (advent:makeobj-empty "Exit" 0 160 70 200)) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor7)) (define game-scenario:outdoor8-objects (list scenario8:cave scenario8:exit)) (define game-scenario:outdoor8-bind (c:scenario:make-bind "game-scenario:outdoor8" "background8" "background8_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor8-objects))) (define game-scenario:outdoor8 (make #:adv:bind game-scenario:outdoor8-bind #:adv:objs game-scenario:outdoor8-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario9.scm Node-kind: file Node-action: change Text-content-length: 743 Text-content-md5: 5c07acedc617faa48f7959da87ab3eb9 Content-length: 743 (adv:define-object scenario9:stone "Stone") (bind-obj scenario9:stone "stone" 442 336 255) (adv:define-object scenario9:exit "Exit") (set! (adv:bind scenario9:exit) (advent:makeobj-empty "Exit" 145 212 90 120)) (define-method use ((ojb )) (adv:set-scenario game-scenario:outdoor8)) (define game-scenario:outdoor9-objects (list scenario9:stone scenario9:exit)) (define game-scenario:outdoor9-bind (c:scenario:make-bind "game-scenario:outdoor9" "background9" "background9_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor9-objects))) (define game-scenario:outdoor9 (make #:adv:bind game-scenario:outdoor9-bind #:adv:objs game-scenario:outdoor9-objects)) ;; EOF ;; Revision-number: 25 Prop-content-length: 231 Content-length: 231 K 7 svn:log V 128 - added interface to set positon and direction of the little mogli - added direction and position setting for each set-scenario K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-14T00:05:26.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 4081 Text-content-md5: 783bd241f4466a22b00ee78fdcd736fd Content-length: 4081 // $Id: Advent.cc,v 1.6 2001/01/14 00:05:26 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" #include "Guy.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); Guy::init_guile (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; // FIXME: wrong place to create this... the_guy = new Guy (); std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); dialog.update (); inventory.update (); Scenario::current->draw (); coin.draw (); inventory.draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: change Text-content-length: 4445 Text-content-md5: 37d1f640464bc7723cb39c4a5c807618 Content-length: 4445 // $Id: Guy.cc,v 1.2 2001/01/14 00:05:26 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy* the_guy; Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; target = pos; delta = 4.0; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Guy::on_button_press)); } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Guy::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } void Guy::init_guile () { gh_new_procedure2_0 ("c:guy:set-position", &Guy::scm_set_pos); gh_new_procedure1_0 ("c:guy:set-direction", &Guy::scm_set_direction); gh_new_procedure2_0 ("c:guy:set-target", &Guy::scm_set_target); } SCM Guy::scm_set_pos (SCM arg_x_pos, SCM arg_y_pos) { the_guy->pos.x = SCM_INUM (arg_x_pos); the_guy->pos.y = SCM_INUM (arg_y_pos); the_guy->target = the_guy->pos; return SCM_UNSPECIFIED; } SCM Guy::scm_set_direction (SCM angle) { puts ("scm_set_direction: not implemented"); switch (SCM_INUM (angle)) { case 0: // up the_guy->direction = CL_Vector (0., -5.); break; case 1: // right the_guy->direction = CL_Vector (5., 0.); break; case 2: // down the_guy->direction = CL_Vector (0., 5.); break; case 3: // left the_guy->direction = CL_Vector (-5., 0.); break; } return SCM_UNSPECIFIED; } SCM Guy::scm_set_target (SCM arg_x_pos, SCM arg_y_pos) { puts ("scm_set_target: not implemented"); the_guy->target.x = SCM_INUM (arg_x_pos); the_guy->target.y = SCM_INUM (arg_y_pos); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Guy.hh Node-kind: file Node-action: change Text-content-length: 1764 Text-content-md5: 58dc40284e5b05e7dc180ebe75bdf88b Content-length: 1764 // $Id: Guy.hh,v 1.2 2001/01/14 00:05:26 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUY_HH #define GUY_HH #include #include "AdventObj.hh" class Guy : public AdventObj { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; thSlot on_button_press_slot; CL_Vector direction; CL_Vector pos; CL_Vector target; float delta; public: Guy (); ~Guy (); bool on_target (); void update (); void draw_world (); void on_button_press(CL_InputDevice *device, const CL_Key &key); float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } static void Guy::init_guile (); // Guile language bindings static SCM scm_set_pos (SCM arg_x_pos, SCM arg_y_pos); static SCM scm_set_direction (SCM angle); static SCM scm_set_target (SCM arg_x_pos, SCM arg_y_pos); }; extern Guy* the_guy; #endif /* EOF */ Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3511 Text-content-md5: ef4352d2810507799fdb17ccaba161bf Content-length: 3511 // $Id: Scenario.cc,v 1.6 2001/01/14 00:05:26 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (the_guy); std::cout << "Objects: " << objects.size() << std::endl; std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } void Scenario::remove (AdventObj* obj) { std::list::iterator obj_iter; obj_iter = find (objects.begin (), objects.end (), obj); if (obj_iter != objects.end ()) objects.erase (obj_iter); } /* EOF */ Node-path: trunk/prototype/TODO Node-kind: file Node-action: change Text-content-length: 286 Text-content-md5: 79a6b444ae9da3c2f50014cebbf6c80b Content-length: 286 * handling of object collision - for example usefull when mogli should automatically brought to a no scenario, with out extra clicking * handling of animated objects * messages and dialogs * timer-callback's * inventory manipulation * on demand loading of scenarios * save games Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 1141 Text-content-md5: 03bd81801da622384cabb78da18b25f8 Content-length: 1141 (println "Loading objects.scm...") (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method look ((obj )) (println "Don't know what you mean")) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method pickup ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (dialog:add "Don't know how to pick that up.")) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (println "Scenario: " game-scenario:gateway) (adv:set-scenario game-scenario:gateway) ;;(adv:set-scenario game-scenario:outdoor7) ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3410 Text-content-md5: 19378b54e3cbf575aa81eb4eb62adcf1 Content-length: 3410 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (bind-obj scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") (adv:define-object scenario1:door "Door" (closed #t)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method use ((obj )) (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (c:scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: change Text-content-length: 1655 Text-content-md5: c5454aae0df56a4e9b226c98324055f5 Content-length: 1655 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object scenario2:path "Path") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 614 439) (c:guy:set-direction 3)) (set! (adv:bind scenario2:path) (advent:makeobj-empty "Path" 0 260 70 220)) ;; Objects (define-class ()) (define-method name ((obj )) "plant") (adv:define-object scenario2:door "Door" (foobar #f)) (define-method use ((obj )) (cond ((not (closed scenario1:door)) (adv:set-scenario game-scenario:gateway) (c:guy:set-position 241 278) (c:guy:set-direction 2)) (else (dialog:add "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed scenario1:door) (advent:set-surface (adv:bind obj) "s2_door_opened") (set! (closed scenario1:door) #f)) (else (advent:set-surface (adv:bind obj) "s2_door_closed") (set! (closed scenario1:door) #t)) )) (define game-scenario:outdoor-objects (list (bind-obj scenario2:door "s2_door_opened" 236 247 0) (make #:adv:bind (advent:makeobj-surface "plant" "plant2" 208 350 194)) scenario2:path)) (define game-scenario:outdoor-bind (c:scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 1525 Text-content-md5: 27670e73a662f69775dd99748cd81074 Content-length: 1525 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 25 433) (c:guy:set-direction 1)) (define-class ()) (define-method name ((obj )) "WayToDoor") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 35 430) (c:guy:set-direction 1)) (define-class ()) (define-method name ((obj )) "plate") (define-method use ((obj )) (dialog:add "You see a plate")) (define game-scenario:outdoor2-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 560 320 80 160)) (make #:adv:bind (advent:makeobj-empty "WayToDoor" 585 260 55 40)) (make #:adv:bind (advent:makeobj-empty "plate" 210 300 40 40)) )) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario4.scm Node-kind: file Node-action: change Text-content-length: 912 Text-content-md5: 8e2624ba49f41cd8a005bbf5485ab842 Content-length: 912 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "NextWay") (define-method use ((obj )) (adv:set-scenario game-scenario:gateway) (c:guy:set-position 423 327) (c:guy:set-direction 3)) (define game-scenario:outdoor3-objects (list (make #:adv:bind (advent:makeobj-empty "NextWay" 440 200 130 140)))) (define game-scenario:outdoor3-bind (c:scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1725 Text-content-md5: 27ea652ea7f6edeb906684af193741bf Content-length: 1725 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-class ()) (define-method name ((obj )) "console") (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)) (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) (make #:adv:bind (advent:makeobj-surface "console" "console" 250 398 228)) (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario6.scm Node-kind: file Node-action: change Text-content-length: 1003 Text-content-md5: 60710c7c891b44e47a6adbe75ea674d8 Content-length: 1003 (adv:define-object scenario6:tunnel "Tunnel") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor7) (c:guy:set-position 80 220) (c:guy:set-direction 2)) (set! (adv:bind scenario6:tunnel) (advent:makeobj-empty "Tunnel" 425 240 125 120)) (adv:define-object scenario6:village "Village") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 460 420) (c:guy:set-direction 3)) (set! (adv:bind scenario6:village) (advent:makeobj-empty "Village" 0 80 170 320)) (define game-scenario:outdoor6-objects (list scenario6:tunnel scenario6:village)) (define game-scenario:outdoor6-bind (c:scenario:make-bind "game-scenario:outdoor6" "background6" "background6_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor6-objects))) (define game-scenario:outdoor6 (make #:adv:bind game-scenario:outdoor6-bind #:adv:objs game-scenario:outdoor6-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario7.scm Node-kind: file Node-action: change Text-content-length: 995 Text-content-md5: fd3535faffdec01ffff0e9d63f328dbf Content-length: 995 (adv:define-object scenario7:tunnel "Tunnel") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 492 335) (c:guy:set-direction 3)) (set! (adv:bind scenario7:tunnel) (advent:makeobj-empty "Tunnel" 26 97 100 121)) (adv:define-object scenario7:path "Path") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor8) (c:guy:set-position 25 306) (c:guy:set-direction 1)) (set! (adv:bind scenario7:path) (advent:makeobj-empty "Path" 336 61 130 160)) (define game-scenario:outdoor7-objects (list scenario7:tunnel scenario7:path )) (define game-scenario:outdoor7-bind (c:scenario:make-bind "game-scenario:outdoor7" "background7" "background7_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor7-objects))) (define game-scenario:outdoor7 (make #:adv:bind game-scenario:outdoor7-bind #:adv:objs game-scenario:outdoor7-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario8.scm Node-kind: file Node-action: change Text-content-length: 975 Text-content-md5: f6e65268e73e28ba38af0485ed4f35e9 Content-length: 975 (adv:define-object scenario8:cave "Cave") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor9) (c:guy:set-position 204 332) (c:guy:set-direction 2)) (set! (adv:bind scenario8:cave) (advent:makeobj-empty "Cave" 300 170 390 120)) (adv:define-object scenario8:exit "Exit") (set! (adv:bind scenario8:exit) (advent:makeobj-empty "Exit" 0 160 70 200)) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor7) (c:guy:set-position 420 200) (c:guy:set-direction 2)) (define game-scenario:outdoor8-objects (list scenario8:cave scenario8:exit)) (define game-scenario:outdoor8-bind (c:scenario:make-bind "game-scenario:outdoor8" "background8" "background8_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor8-objects))) (define game-scenario:outdoor8 (make #:adv:bind game-scenario:outdoor8-bind #:adv:objs game-scenario:outdoor8-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario9.scm Node-kind: file Node-action: change Text-content-length: 800 Text-content-md5: ff50ff041b3719e317cfe5254e6e609b Content-length: 800 (adv:define-object scenario9:stone "Stone") (bind-obj scenario9:stone "stone" 442 336 255) (adv:define-object scenario9:exit "Exit") (set! (adv:bind scenario9:exit) (advent:makeobj-empty "Exit" 145 212 90 120)) (define-method use ((ojb )) (adv:set-scenario game-scenario:outdoor8) (c:guy:set-position 342 292) (c:guy:set-direction 2)) (define game-scenario:outdoor9-objects (list scenario9:stone scenario9:exit)) (define game-scenario:outdoor9-bind (c:scenario:make-bind "game-scenario:outdoor9" "background9" "background9_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor9-objects))) (define game-scenario:outdoor9 (make #:adv:bind game-scenario:outdoor9-bind #:adv:objs game-scenario:outdoor9-objects)) ;; EOF ;; Revision-number: 26 Prop-content-length: 182 Content-length: 182 K 7 svn:log V 80 Implemented c:guy:set-target and a callback when the guy has reached the target K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-14T12:12:49.000000Z PROPS-END Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 4237 Text-content-md5: a90f18794c68ea63aed97fca67521e37 Content-length: 4237 // $Id: GuileAdventObj.cc,v 1.8 2001/01/14 12:12:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } scm_object = SCM_BOOL_F; surface_visible = true; } SCM GuileAdventObj::call (std::string func) { if (SCM_BOOL_F == scm_object) { puts ("don't have scm object for call"); return SCM_BOOL_F; } else { char* str = strdup (func.c_str ()); SCM ret_val = gh_call1 (gh_lookup (str), scm_object); free (str); return ret_val; } } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } void GuileAdventObj::draw_inventory (int x, int y) { std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2205 Text-content-md5: cd130d07326b5a67a07ccfb3c808c4ad Content-length: 2205 // $Id: GuileAdventObj.hh,v 1.7 2001/01/14 12:12:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Surface inventory_sur; CL_Vector pos; int width; int height; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y); virtual void call (std::string func, std::string id); SCM call (std::string func); SCM get_scm () { return scm_object; } virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); virtual void set_inventory_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: change Text-content-length: 5389 Text-content-md5: 971a74db5293501a608731d60097a7b5 Content-length: 5389 // $Id: Guy.cc,v 1.3 2001/01/14 12:12:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "GuileAdventObj.hh" #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy* the_guy; Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; target = pos; delta = 4.0; target_callback = SCM_BOOL_F; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Guy::on_button_press)); } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { if (target_callback != SCM_BOOL_F) { gh_call0 (target_callback); target_callback = SCM_BOOL_F; } counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Guy::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { AdventObj* obj = Scenario::current->get_object (key.x, key.y); GuileAdventObj* guile_obj = dynamic_cast(obj); if (obj && guile_obj) { std::cout << "Issued walkto event" << std::endl; std::cout << "Obj: " << obj << " name: " << guile_obj->get_name () << std::endl; if (guile_obj->call ("walk") == SCM_BOOL_F) { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } else { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } void Guy::init_guile () { gh_new_procedure2_0 ("c:guy:set-position", &Guy::scm_set_pos); gh_new_procedure1_0 ("c:guy:set-direction", &Guy::scm_set_direction); gh_new_procedure3_0 ("c:guy:set-target", &Guy::scm_set_target); } SCM Guy::scm_set_pos (SCM arg_x_pos, SCM arg_y_pos) { the_guy->pos.x = SCM_INUM (arg_x_pos); the_guy->pos.y = SCM_INUM (arg_y_pos); the_guy->target = the_guy->pos; return SCM_UNSPECIFIED; } SCM Guy::scm_set_direction (SCM angle) { switch (SCM_INUM (angle)) { case 0: // up the_guy->direction = CL_Vector (0., -5.); break; case 1: // right the_guy->direction = CL_Vector (5., 0.); break; case 2: // down the_guy->direction = CL_Vector (0., 5.); break; case 3: // left the_guy->direction = CL_Vector (-5., 0.); break; } return SCM_UNSPECIFIED; } SCM Guy::scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback) { the_guy->direction = CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM (arg_y_pos)); the_guy->direction.normalize (); the_guy->direction *= 5.0; the_guy->target = CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM (arg_y_pos)); the_guy->target_callback = callback; printf (" Target Pos: %f %f\n", the_guy->target.x, the_guy->target.y); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Guy.hh Node-kind: file Node-action: change Text-content-length: 1801 Text-content-md5: 38c383f5f17a4b2644dbeba32a6aae32 Content-length: 1801 // $Id: Guy.hh,v 1.3 2001/01/14 12:12:49 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUY_HH #define GUY_HH #include #include "AdventObj.hh" class Guy : public AdventObj { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; thSlot on_button_press_slot; CL_Vector direction; CL_Vector pos; CL_Vector target; SCM target_callback; float delta; public: Guy (); ~Guy (); bool on_target (); void update (); void draw_world (); void on_button_press(CL_InputDevice *device, const CL_Key &key); float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } static void Guy::init_guile (); // Guile language bindings static SCM scm_set_pos (SCM arg_x_pos, SCM arg_y_pos); static SCM scm_set_direction (SCM angle); static SCM scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback); }; extern Guy* the_guy; #endif /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5290 Text-content-md5: ba3b3cb0323b3d20828240fed84e5ee3 Content-length: 5326 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (adv:set-scenario scen) (c:scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (bind-obj obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 1270 Text-content-md5: 7b5b90e4b0cce72e251fee3984d9f865 Content-length: 1270 (println "Loading objects.scm...") #! obsolete (define-method look ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know what you mean")) !# ;; Currently not implemented (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method pickup ((obj )) (dialog:add "Don't know how to pick that up.")) (define-method walk ((obj )) ;; (println "I am a BUG 129233") #f) (define (adv:load file) (println "Loading file: " file) (load file)) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (println "Scenario: " game-scenario:gateway) (adv:set-scenario game-scenario:gateway) ;;(adv:set-scenario game-scenario:outdoor7) ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3535 Text-content-md5: 2f260ae08c40b9d81031bc2fdff27e67 Content-length: 3535 ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (bind-obj scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") (adv:define-object scenario1:door "Door" (closed #t)) (define-class ()) (define-method name ((obj )) "Gateway") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method use ((obj )) (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) #!(define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) !# ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest (bind-obj scenario1:door "door_closed" 198 211 0) ;; (make #:adv:bind (advent:makeobj-surface "door" "door_closed" ;; 198 211 0)) (make #:adv:bind (advent:makeobj-empty "Gateway" 405 105 130 225)) )) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (c:scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Revision-number: 27 Prop-content-length: 272 Content-length: 272 K 7 svn:log V 169 Walking without 'using a door' works now (only implemented for the first scenario) I f*** up the garbage collector somewhere so the game might randomly crash on startup K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-14T13:28:57.000000Z PROPS-END Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 4825 Text-content-md5: a51e8ea9c03beefaa332db0276c342a6 Content-length: 4825 // $Id: AdventObjSmob.cc,v 1.8 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "helper.hh" #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark_obj); scm_set_smob_free (tag, &AdventObjSmob::free_obj); scm_set_smob_print (tag, &AdventObjSmob::print_obj); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure5_0 ("c:adv:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); gh_new_procedure2_0("advent:set-inventory-surface", AdventObjSmob::set_inventory_surface); } SCM AdventObjSmob::mark_obj (SCM smob) { return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free_obj (SCM smob) { std::cout << "Freeing object..." << std::endl; return 0; } int AdventObjSmob::print_obj (SCM smob, SCM port, scm_print_state *pstate) { std::cout << "Printing object..." << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::scm_makeobj_empty (SCM obj, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { AdventObjP* advobj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); advobj->obj = new GuileAdventObj (obj, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, advobj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_inventory_surface (SCM obj, SCM name) { std::cout << "AdventObjSmob::set_inventory_surface" << std::endl; std::cout << "name: " << SCM_CHARS (name) << std::endl; GuileAdventObj* advobj = scm2GuileAdventObj (obj); std::cout << "Pointer: " << advobj << std::endl; advobj->set_inventory_surface (SCM_CHARS (name)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1655 Text-content-md5: b9910f17ded31a653efc4a66dd611dac Content-length: 1655 // $Id: AdventObjSmob.hh,v 1.5 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { AdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static SCM mark_obj (SCM smob); static scm_sizet free_obj (SCM smob); static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static SCM makeobj_surface (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM scm_makeobj_empty (SCM obj, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM makeobj_empty (SCM name, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM set_surface (SCM obj, SCM name); static SCM set_inventory_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 4210 Text-content-md5: 0bea8a6d9d1226b0d5cd27083a4fb2b8 Content-length: 4210 // $Id: GuileAdventObj.cc,v 1.9 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; } SCM GuileAdventObj::call (std::string func) { if (SCM_BOOL_F == scm_object) { puts ("don't have scm object for call"); return SCM_BOOL_F; } else { char* str = strdup (func.c_str ()); SCM ret_val = gh_call1 (gh_lookup (str), scm_object); free (str); return ret_val; } } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } void GuileAdventObj::draw_inventory (int x, int y) { std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: change Text-content-length: 5429 Text-content-md5: 64df7404fe2e9baba9a579f0e2a043cf Content-length: 5429 // $Id: Guy.cc,v 1.4 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "GuileAdventObj.hh" #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy* the_guy; Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; target = pos; delta = 4.0; target_callback = SCM_BOOL_F; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Guy::on_button_press)); } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { if (target_callback != SCM_BOOL_F) { gh_call0 (target_callback); target_callback = SCM_BOOL_F; } counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Guy::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { AdventObj* obj = Scenario::current->get_object (key.x, key.y); GuileAdventObj* guile_obj = dynamic_cast(obj); if (obj && guile_obj) { std::cout << "Issued walkto event" << std::endl; std::cout << "Obj: " << obj << " name: " << guile_obj->get_name () << std::endl; if (guile_obj->call ("walk") == SCM_BOOL_F) { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } else { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } void Guy::init_guile () { gh_new_procedure2_0 ("c:guy:set-position", &Guy::scm_set_pos); gh_new_procedure1_0 ("c:guy:set-direction", &Guy::scm_set_direction); gh_new_procedure3_0 ("c:guy:set-target", &Guy::scm_set_target); } SCM Guy::scm_set_pos (SCM arg_x_pos, SCM arg_y_pos) { the_guy->pos.x = SCM_INUM (arg_x_pos); the_guy->pos.y = SCM_INUM (arg_y_pos); the_guy->target = the_guy->pos; return SCM_UNSPECIFIED; } SCM Guy::scm_set_direction (SCM angle) { switch (SCM_INUM (angle)) { case 0: // up the_guy->direction = CL_Vector (0., -5.); break; case 1: // right the_guy->direction = CL_Vector (5., 0.); break; case 2: // down the_guy->direction = CL_Vector (0., 5.); break; case 3: // left the_guy->direction = CL_Vector (-5., 0.); break; } return SCM_UNSPECIFIED; } SCM Guy::scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback) { the_guy->direction = CL_Vector (SCM_INUM(arg_x_pos) - the_guy->pos.x, SCM_INUM (arg_y_pos) - the_guy->pos.y); the_guy->direction.normalize (); the_guy->direction *= 5.0; the_guy->target = CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM (arg_y_pos)); the_guy->target_callback = callback; printf (" Target Pos: %f %f\n", the_guy->target.x, the_guy->target.y); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3515 Text-content-md5: e1d7f0733a4d86781902be0e4f5b1510 Content-length: 3515 // $Id: Scenario.cc,v 1.7 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (std::string name, std::string background, std::string colmap, std::list objects) { this->name = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (the_guy); //std::cout << "Objects: " << objects.size() << std::endl; //std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } void Scenario::remove (AdventObj* obj) { std::list::iterator obj_iter; obj_iter = find (objects.begin (), objects.end (), obj); if (obj_iter != objects.end ()) objects.erase (obj_iter); } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3087 Text-content-md5: aa0147db40c1b2712fbd60cfa35aa246 Content-length: 3087 // $Id: ScenarioSmob.cc,v 1.7 2001/01/14 13:28:57 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } obj->scenario = new Scenario (SCM_CHARS (scenario_name), SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3853 Text-content-md5: 7823f9fb7403d63dbdc97fe99a5787c8 Content-length: 3853 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (bind-obj scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (set! (adv:bind scenario1:gateway) (c:adv:makeobj-empty scenario1:gateway 405 105 130 225)) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (bind-obj scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) #!(define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) !# ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest scenario1:door scenario1:gateway)) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (c:scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Revision-number: 28 Prop-content-length: 246 Content-length: 246 K 7 svn:log V 143 - switched guile debuging on - added some more walk-to events - some cleanup in the scenarios (getting rid of define-class in the user code) K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-14T17:50:31.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 4198 Text-content-md5: c9798bb454e5fe312f284a2af56b4f30 Content-length: 4198 // $Id: Advent.cc,v 1.7 2001/01/14 17:50:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" #include "Guy.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; // Debuging on SCM_DEVAL_P = 1; SCM_BACKTRACE_P = 1; SCM_RECORD_POSITIONS_P = 1; SCM_RESET_DEBUG_MODE; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); Guy::init_guile (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; Coin coin; // FIXME: wrong place to create this... the_guy = new Guy (); std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin.update (); dialog.update (); inventory.update (); Scenario::current->draw (); coin.draw (); inventory.draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5440 Text-content-md5: 02df5d78e772a4d66642605e7c3cdd2f Content-length: 5476 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (adv:set-scenario scen) (c:scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (adv:bind-surface obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:bind-empty obj x-pos y-pos width height) (set! (adv:bind obj) (advent:makeobj-empty obj x-pos y-pos width height))) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3817 Text-content-md5: f0202e23e24fd7777cd59cc2b2f1a86c Content-length: 3817 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (adv:bind-surface scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (adv:bind-empty scenario1:gateway 405 105 130 225) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (adv:bind-surface scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario (define game-scenario:gateway-objects (list scenario1:chest scenario1:door scenario1:gateway)) ;; We create the connection to the c++ world (FIXME: shoud be hidden ;; for the normal guile interface) (define game-scenario:gateway-bind (c:scenario:make-bind "game-scenario:gateway" "background" "background_cmap" (map (lambda (x) (adv:bind x)) game-scenario:gateway-objects))) (define game-scenario:gateway (make #:adv:bind game-scenario:gateway-bind #:adv:objs game-scenario:gateway-objects )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: change Text-content-length: 1853 Text-content-md5: f150bb10a77f24991fd99b550b5bc663 Content-length: 1853 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object scenario2:path "Path") (define-method walk ((obj )) (c:guy:set-target 22 424 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 614 439) (c:guy:set-direction 3)))) (adv:bind-empty scenario2:path 0 260 70 220) ;; Objects ;; Plant (adv:define-object scenario2:plant "Plant") (adv:bind-surface scenario2:plant "plant2" 208 350 194) (define-method walk ((obj )) (c:guy:set-target 180 420 (lambda () (c:guy:set-direction 1)))) ;; Door (adv:define-object scenario2:door "Door" (foobar #f)) (adv:bind-surface scenario2:door "s2_door_opened" 236 247 0) (define-method walk ((obj )) (c:guy:set-target 302 336 (lambda () (cond ((not (closed scenario1:door)) (adv:set-scenario game-scenario:gateway) (c:guy:set-position 241 278) (c:guy:set-direction 2)) (else (dialog:add "Door is closed.")))))) (define-method gopen ((obj )) (cond ((closed scenario1:door) (advent:set-surface (adv:bind obj) "s2_door_opened") (set! (closed scenario1:door) #f)) (else (advent:set-surface (adv:bind obj) "s2_door_closed") (set! (closed scenario1:door) #t)) )) (define game-scenario:outdoor-objects (list scenario2:door scenario2:plant scenario2:path)) (define game-scenario:outdoor-bind (c:scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 1289 Text-content-md5: 66df4e5d5a2a3abecd65e29b9a25171a Content-length: 1289 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor2:way "back to gateway station") (adv:bind-empty outdoor2:way 560 320 80 160) (define-method walk ((obj )) (c:guy:set-target 614 439 (lambda () (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 25 433) (c:guy:set-direction 1)))) (adv:define-object outdoor2:way2 "WayToDoor") (adv:bind-empty outdoor2:way2 585 260 55 40) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 35 430) (c:guy:set-direction 1)) (adv:define-object outdoor2:plate "plate") (adv:bind-empty outdoor2:plate 210 300 40 40) (define-method use ((obj )) (dialog:add "You see a plate")) (define game-scenario:outdoor2-objects (list outdoor2:way outdoor2:way2 outdoor2:plate)) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario4.scm Node-kind: file Node-action: change Text-content-length: 1028 Text-content-md5: 36cabed32e98535bf569bda8b2fadb3e Content-length: 1028 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Third outdoor scene, the othe gateway ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor3:gateway "Gateway") (adv:bind-empty outdoor3:gateway 440 200 130 140) ;;(define-method use ((obj )) ;; (adv:set-scenario game-scenario:gateway) ;; (c:guy:set-position 423 327) ;; (c:guy:set-direction 3)) (define-method walk ((obj )) (c:guy:set-target 455 338 (lambda () (adv:set-scenario game-scenario:gateway) (c:guy:set-position 423 327) (c:guy:set-direction 3)))) (define game-scenario:outdoor3-objects (list outdoor3:gateway)) (define game-scenario:outdoor3-bind (c:scenario:make-bind "game-scenario:outdoor3" "background4" "background4_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor3-objects))) (define game-scenario:outdoor3 (make #:adv:bind game-scenario:outdoor3-bind #:adv:objs game-scenario:outdoor3-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1633 Text-content-md5: 36799a9287b983f244af55a0f46f4ae3 Content-length: 1633 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)) (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) outdoor4:console (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario9.scm Node-kind: file Node-action: change Text-content-length: 778 Text-content-md5: ffd2b3c5ca639e806a4a2e2e610db17f Content-length: 778 (adv:define-object scenario9:stone "Stone") (adv:bind-surface scenario9:stone "stone" 442 336 255) (adv:define-object scenario9:exit "Exit") (adv:bind-empty scenario9:exit 145 212 90 120) (define-method use ((ojb )) (adv:set-scenario game-scenario:outdoor8) (c:guy:set-position 342 292) (c:guy:set-direction 2)) (define game-scenario:outdoor9-objects (list scenario9:stone scenario9:exit)) (define game-scenario:outdoor9-bind (c:scenario:make-bind "game-scenario:outdoor9" "background9" "background9_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor9-objects))) (define game-scenario:outdoor9 (make #:adv:bind game-scenario:outdoor9-bind #:adv:objs game-scenario:outdoor9-objects)) ;; EOF ;; Revision-number: 29 Prop-content-length: 208 Content-length: 208 K 7 svn:log V 105 - added some nicer syntax for defining scenarios - more garbage collector bugs - some more walk methodes K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-15T07:38:30.000000Z PROPS-END Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 3577 Text-content-md5: d92691c32f226f010e80cd4d15c952fc Content-length: 3577 // $Id: Scenario.cc,v 1.8 2001/01/15 07:38:30 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (SCM name, std::string background, std::string colmap, std::list objects) { if (SCM_STRINGP (name)) this->name = SCM_CHARS (name); else scm_object = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (the_guy); //std::cout << "Objects: " << objects.size() << std::endl; //std::cout << "Objects this: " << this->objects.size() << std::endl; } /* Scenario::Scenario () { objects.push_back (new GuileAdventObj (this, "odd" , 3, CL_Surface ("odd", app.get_resource ()), CL_Vector (340, 216, 230))); objects.push_back (new GuileAdventObj (this, "tree", 2, CL_Surface ("tree", app.get_resource ()), CL_Vector (0, 211, 255))); objects.push_back (new GuileAdventObj (this, "takeme", 1, CL_Surface ("takeme", app.get_resource ()), CL_Vector (236, 300, 240))); } */ Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } void Scenario::remove (AdventObj* obj) { std::list::iterator obj_iter; obj_iter = find (objects.begin (), objects.end (), obj); if (obj_iter != objects.end ()) objects.erase (obj_iter); } /* EOF */ Node-path: trunk/prototype/Scenario.hh Node-kind: file Node-action: change Text-content-length: 1838 Text-content-md5: e4dc14a26fa3f3b1a5b66080b86b2055 Content-length: 1838 // $Id: Scenario.hh,v 1.4 2001/01/15 07:38:30 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIO_HH #define SCENARIO_HH #include #include #include "AdventObj.hh" #include "Background.hh" #include "CollisionMap.hh" class AdventObj; class Scenario { protected: std::list objects; Background* background; CollisionMap* colmap; std::string name; SCM scm_object; public: /// static std::list scenario_list; /// static Scenario* current; Scenario (SCM name, std::string background, std::string colmap, std::list objects); virtual ~Scenario (); static void set_current_scenario (std::string name); static void set_current_scenario (Scenario* scenario); virtual std::string get_name () { return name; } virtual void draw (); virtual void update (); virtual CollisionMap* get_colmap (); virtual AdventObj* get_object (int x, int y); virtual void add (AdventObj* obj); virtual void remove (AdventObj* obj); }; #endif /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3180 Text-content-md5: bf4848bc709ac746dc6090704450622a Content-length: 3180 // $Id: ScenarioSmob.cc,v 1.8 2001/01/15 07:38:30 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } assert(SCM_STRINGP (background_surface)); assert(SCM_STRINGP (colmap_surface)); obj->scenario = new Scenario (scenario_name, SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3526 Text-content-md5: 5c99f52b53d3dbd34fbd4b82b046e5b3 Content-length: 3526 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (adv:bind-surface scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (adv:bind-empty scenario1:gateway 405 105 130 225) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (adv:bind-surface scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method gopen ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario ;;(define game-scenario:gateway-objects ;; (list scenario1:chest ;; scenario1:door ;; scenario1:gateway)) (adv:define-scenario game-scenario:gateway "background" "background_cmap" (list scenario1:chest scenario1:gateway scenario1:door)) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 1426 Text-content-md5: 90b22d0dd437737bb1164bf52605bdc2 Content-length: 1426 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor2:way "back to gateway station") (adv:bind-empty outdoor2:way 560 400 80 80) (define-method walk ((obj )) (c:guy:set-target 614 439 (lambda () (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 25 433) (c:guy:set-direction 1)))) (adv:define-object outdoor2:way2 "WayToDoor") (adv:bind-empty outdoor2:way2 585 260 55 40) (define-method walk ((obj )) (c:guy:set-target 618 326 (lambda () (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 35 430) (c:guy:set-direction 1)))) (adv:define-object outdoor2:plate "plate") (adv:bind-empty outdoor2:plate 210 300 40 40) (define-method use ((obj )) (dialog:add "You see a plate")) (define-method walk ((obj )) (c:guy:set-target 232 397 #f)) (define game-scenario:outdoor2-objects (list outdoor2:way outdoor2:way2 outdoor2:plate)) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1775 Text-content-md5: 6487b96ea705cf48a449cf7d838e998e Content-length: 1775 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (define-class ()) (define-method name ((obj )) "back") (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)) (define-class () (closed #:accessor closed #:init-value #f)) (define-method name ((obj )) "door") (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))) (define game-scenario:outdoor4-objects (list (make #:adv:bind (advent:makeobj-surface "door" "door_obj" 310 31 0)) outdoor4:console (make #:adv:bind (advent:makeobj-empty "back" 0 300 70 340)) )) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/syntax-ext.scm Node-kind: file Node-action: change Text-content-length: 1729 Text-content-md5: 3b0339450e8fe12c8522d2dfd673b0f0 Content-length: 1729 (use-modules (ice-9 syncase)) ;; Define a class and the corresponding object (define-syntax adv:define-object (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) (eval `(define type (make ,classname))) )) ((_ type str-name (mem-name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value str-name) (mem-name #:accessor mem-name #:init-value value ;; #:init-keyword #:,(string->symbol "#:name") ) ...)) (eval `(define type (make ,classname))) )) )) ;; Define only a class (rarly used) (define-syntax adv:define-class (syntax-rules () ((_ type) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname ())) )) ((_ type (name value) ...) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define-class ,classname () (name #:accessor name #:init-value value) ...)) )) )) ;; Define an scenario (define-syntax adv:define-scenario (syntax-rules () ((_ name surface colmap objects) (let ((classname (string->symbol (string-append "<" (symbol->string 'type) ">")))) (eval `(define name (make #:adv:bind (c:scenario:make-bind "name-blub" surface colmap (map (lambda (x) (adv:bind x)) objects)) #:adv:objs objects))))) )) ;; EOF ;; Revision-number: 30 Prop-content-length: 165 Content-length: 165 K 7 svn:log V 63 More walk methodes, the complete world should now be walk-able K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-15T08:00:27.000000Z PROPS-END Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 1616 Text-content-md5: 9a9e3be3a16ba75a528d13419f1d5364 Content-length: 1616 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method use ((console )) (let ((obj (get-obj "door"))) (cond ((closed obj) (set! (closed obj) #f) (advent:set-surface (adv:bind obj) "door_obj")) (else (set! (closed obj) #t) (advent:set-surface (adv:bind obj) ""))))) (adv:define-object outdoor4:back "back") (adv:bind-empty outdoor4:back 0 300 70 340) (define-method walk ((obj )) (c:guy:set-target 0 426 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)))) (adv:define-object outdoor4:door "Door" (closed #f)) (adv:bind-surface outdoor4:door "door_obj" 310 31 0) (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))) (define game-scenario:outdoor4-objects (list outdoor4:door outdoor4:console outdoor4:back)) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario6.scm Node-kind: file Node-action: change Text-content-length: 1060 Text-content-md5: 95ef30af82d32c932061f0f99c6c733b Content-length: 1060 (adv:define-object scenario6:tunnel "Tunnel") (define-method walk ((obj )) (c:guy:set-target 502 334 (lambda () (adv:set-scenario game-scenario:outdoor7) (c:guy:set-position 80 220) (c:guy:set-direction 2)))) (adv:bind-empty scenario6:tunnel 425 240 125 120) (adv:define-object scenario6:village "Village") (adv:bind-empty scenario6:village 0 80 170 320) (define-method walk ((obj )) (c:guy:set-target 103 411 (lambda () (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 460 420) (c:guy:set-direction 3)))) (define game-scenario:outdoor6-objects (list scenario6:tunnel scenario6:village)) (define game-scenario:outdoor6-bind (c:scenario:make-bind "game-scenario:outdoor6" "background6" "background6_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor6-objects))) (define game-scenario:outdoor6 (make #:adv:bind game-scenario:outdoor6-bind #:adv:objs game-scenario:outdoor6-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario7.scm Node-kind: file Node-action: change Text-content-length: 1034 Text-content-md5: ba2b9d9fafb4061db51ea7742f39635d Content-length: 1034 (adv:define-object scenario7:tunnel "Tunnel") (adv:bind-empty scenario7:tunnel 26 97 100 121) (define-method walk ((obj )) (c:guy:set-target 78 224 (lambda () (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 492 335) (c:guy:set-direction 3)))) (adv:define-object scenario7:path "Path") (adv:bind-empty scenario7:path 336 61 130 160) (define-method walk ((obj )) (c:guy:set-target 403 195 (lambda () (adv:set-scenario game-scenario:outdoor8) (c:guy:set-position 25 306) (c:guy:set-direction 1)))) (define game-scenario:outdoor7-objects (list scenario7:tunnel scenario7:path)) (define game-scenario:outdoor7-bind (c:scenario:make-bind "game-scenario:outdoor7" "background7" "background7_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor7-objects))) (define game-scenario:outdoor7 (make #:adv:bind game-scenario:outdoor7-bind #:adv:objs game-scenario:outdoor7-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario8.scm Node-kind: file Node-action: change Text-content-length: 1043 Text-content-md5: 71cdc987de7e3eab6516d7e0961e1779 Content-length: 1043 (adv:define-object scenario8:cave "Cave") (adv:bind-empty scenario8:cave 300 170 390 120) (define-method walk ((obj )) (c:guy:set-target 341 288 (lambda () (adv:set-scenario game-scenario:outdoor9) (c:guy:set-position 204 332) (c:guy:set-direction 2)))) (adv:define-object scenario8:exit "Exit") (adv:bind-empty scenario8:exit 0 160 70 200) (define-method walk ((obj )) (c:guy:set-target 14 305 (lambda () (adv:set-scenario game-scenario:outdoor7) (c:guy:set-position 420 200) (c:guy:set-direction 2)))) (define game-scenario:outdoor8-objects (list scenario8:cave scenario8:exit)) (define game-scenario:outdoor8-bind (c:scenario:make-bind "game-scenario:outdoor8" "background8" "background8_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor8-objects))) (define game-scenario:outdoor8 (make #:adv:bind game-scenario:outdoor8-bind #:adv:objs game-scenario:outdoor8-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario9.scm Node-kind: file Node-action: change Text-content-length: 846 Text-content-md5: 5f7dab7cf2114b157651f4719a9107af Content-length: 846 (adv:define-object scenario9:stone "Stone") (adv:bind-surface scenario9:stone "stone" 442 336 255) (adv:define-object scenario9:exit "Exit") (adv:bind-empty scenario9:exit 145 212 90 120) (define-method walk ((ojb )) (c:guy:set-target 202 326 (lambda () (adv:set-scenario game-scenario:outdoor8) (c:guy:set-position 342 292) (c:guy:set-direction 2)))) (define game-scenario:outdoor9-objects (list scenario9:stone scenario9:exit)) (define game-scenario:outdoor9-bind (c:scenario:make-bind "game-scenario:outdoor9" "background9" "background9_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor9-objects))) (define game-scenario:outdoor9 (make #:adv:bind game-scenario:outdoor9-bind #:adv:objs game-scenario:outdoor9-objects)) ;; EOF ;; Revision-number: 31 Prop-content-length: 207 Content-length: 207 K 7 svn:log V 104 Probally a workaround for the garbage collector problem, not sure about it, but it seems to work for be K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-24T09:09:07.000000Z PROPS-END Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 4954 Text-content-md5: 3e4a9a42ff425a7286a80d7812b804b5 Content-length: 4954 // $Id: AdventObjSmob.cc,v 1.9 2001/01/24 09:09:07 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "helper.hh" #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark); scm_set_smob_free (tag, &AdventObjSmob::free); scm_set_smob_print (tag, &AdventObjSmob::print); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure5_0 ("c:adv:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); gh_new_procedure2_0("advent:set-inventory-surface", AdventObjSmob::set_inventory_surface); } SCM AdventObjSmob::mark (SCM smob) { std::cout << ">>Marking AdventObjSmob<<" << std::endl; return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free (SCM smob) { GuileAdventObj* obj = scm2GuileAdventObj (smob); std::cout << ">>Freeing AdventObjSmob: " << obj->get_name () << "<<"<< std::endl; return 0; } int AdventObjSmob::print (SCM smob, SCM port, scm_print_state *pstate) { std::cout << ">>Printing AdventObjSmob<<" << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::scm_makeobj_empty (SCM obj, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { AdventObjP* advobj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); advobj->obj = new GuileAdventObj (obj, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, advobj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_inventory_surface (SCM obj, SCM name) { std::cout << "AdventObjSmob::set_inventory_surface" << std::endl; std::cout << "name: " << SCM_CHARS (name) << std::endl; GuileAdventObj* advobj = scm2GuileAdventObj (obj); std::cout << "Pointer: " << advobj << std::endl; advobj->set_inventory_surface (SCM_CHARS (name)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1638 Text-content-md5: 55e1966ad71731ebb7caa18106b688fd Content-length: 1638 // $Id: AdventObjSmob.hh,v 1.6 2001/01/24 09:09:07 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { AdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static scm_sizet free (SCM smob); static SCM mark (SCM smob); static int print (SCM image_smob, SCM port, scm_print_state *pstate); static SCM makeobj_surface (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM scm_makeobj_empty (SCM obj, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM makeobj_empty (SCM name, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM set_surface (SCM obj, SCM name); static SCM set_inventory_surface (SCM obj, SCM name); }; #endif /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3788 Text-content-md5: c317099f812ee9c988a08222e2dc4ad6 Content-length: 3788 // $Id: ScenarioSmob.cc,v 1.9 2001/01/24 09:09:07 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); scm_set_smob_mark (tag, ScenarioSmob::mark); scm_set_smob_free (tag, ScenarioSmob::free); scm_set_smob_print (tag, ScenarioSmob::print); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::mark (SCM smob) { std::cout << ">>ScenarioSmob: Marking...<<" << std::endl; // std::cout << "Marking: " << obj->get_name () << std::endl; return SCM_UNSPECIFIED; } scm_sizet ScenarioSmob::free (SCM smob) { std::cout << ">>ScenarioSmob: Freeing...<<" << std::endl; return 0; } int ScenarioSmob::print (SCM image_smob, SCM port, scm_print_state *pstate) { std::cout << ">>ScenarioSmob: Printing...<<" << std::endl; return 1; } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } assert(SCM_STRINGP (background_surface)); assert(SCM_STRINGP (colmap_surface)); obj->scenario = new Scenario (scenario_name, SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.hh Node-kind: file Node-action: change Text-content-length: 1657 Text-content-md5: dc274823edd12257c7d594a19a8ea1a0 Content-length: 1657 // $Id: ScenarioSmob.hh,v 1.3 2001/01/24 09:09:07 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef SCENARIOSMOB_HH #define SCENARIOSMOB_HH class ScenarioSmob { private: /// The uniq id of this object type, only used by the guile internals static long tag; public: /// Register the smob to guile static void init (); //static SCM mark_obj (SCM smob); //static scm_sizet free_obj (SCM smob); //static int print_obj (SCM smob, SCM port, scm_print_state *pstate); static scm_sizet free (SCM smob); static SCM mark (SCM smob); static int print (SCM image_smob, SCM port, scm_print_state *pstate); static SCM set_current_scenario (SCM scenario_bind); static SCM make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects); static SCM ScenarioSmob::remove (SCM obj); }; #endif /* EOF */ Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 1307 Text-content-md5: c207fa05010b81c51a9fe853cc7973e7 Content-length: 1307 (println "Loading objects.scm...") #! obsolete (define-method look ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know what you mean")) !# ;; Currently not implemented (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method look ((obj )) (println "You see a " (name obj) ", nothing special.")) (define-method pickup ((obj )) (dialog:add "Don't know how to pick that up.")) (define-method walk ((obj )) ;; (println "I am a BUG 129233") #f) (define (adv:load file) (println "Loading file: " file) (load file)) ;;(gc-set-debug-check-freelist! #t) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (println "Scenario: " game-scenario:gateway) (adv:set-scenario game-scenario:gateway) ;;(adv:set-scenario game-scenario:outdoor7) ;; EOF ;; Revision-number: 32 Prop-content-length: 186 Content-length: 186 K 7 svn:log V 84 Added some code to combine two objects, try the key with the console for an example K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-29T09:12:40.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 4209 Text-content-md5: 8fe2ff3942bbedd440ae779ec07019a2 Content-length: 4209 // $Id: Advent.cc,v 1.8 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" #include "Guy.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; // Debuging on SCM_DEVAL_P = 1; SCM_BACKTRACE_P = 1; SCM_RECORD_POSITIONS_P = 1; SCM_RESET_DEBUG_MODE; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); Guy::init_guile (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; coin = new Coin (); // FIXME: wrong place to create this... the_guy = new Guy (); std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin->update (); dialog.update (); inventory.update (); Scenario::current->draw (); coin->draw (); inventory.draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 4957 Text-content-md5: 24274745cf3903db9d56ae773fdf6b17 Content-length: 4957 // $Id: AdventObjSmob.cc,v 1.10 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "helper.hh" #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark); scm_set_smob_free (tag, &AdventObjSmob::free); scm_set_smob_print (tag, &AdventObjSmob::print); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure5_0 ("c:adv:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); gh_new_procedure2_0("advent:set-inventory-surface", AdventObjSmob::set_inventory_surface); } SCM AdventObjSmob::mark (SCM smob) { //std::cout << ">>Marking AdventObjSmob<<" << std::endl; return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free (SCM smob) { GuileAdventObj* obj = scm2GuileAdventObj (smob); std::cout << ">>Freeing AdventObjSmob: " << obj->get_name () << "<<"<< std::endl; return 0; } int AdventObjSmob::print (SCM smob, SCM port, scm_print_state *pstate) { std::cout << ">>Printing AdventObjSmob<<" << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::scm_makeobj_empty (SCM obj, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { AdventObjP* advobj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); advobj->obj = new GuileAdventObj (obj, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, advobj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_inventory_surface (SCM obj, SCM name) { std::cout << "AdventObjSmob::set_inventory_surface" << std::endl; std::cout << "name: " << SCM_CHARS (name) << std::endl; GuileAdventObj* advobj = scm2GuileAdventObj (obj); std::cout << "Pointer: " << advobj << std::endl; advobj->set_inventory_surface (SCM_CHARS (name)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 5283 Text-content-md5: dcd40cf45f164c8f3e8d10847091765e Content-length: 5283 // $Id: Coin.cc,v 1.7 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin* coin; Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; current_obj = 0; ignore_press = false; } void Coin::draw () { if (current_obj) current_obj->draw_inventory (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::set_current_obj (AdventObj* obj) { current_obj = obj; } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 0) { if (inventory.is_visible ()) ignore_press = true; } else if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 0 && current_obj) { if (ignore_press) ignore_press = false; else { AdventObj* marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { GuileAdventObj* obj = dynamic_cast(marked_obj); GuileAdventObj* cobj = dynamic_cast(current_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; current_obj = 0; } else { std::cout << "Use: " << current_obj->get_name () << " with " << obj->get_name () << std::endl; gh_call2 (gh_lookup ("combine"), cobj->get_scm (), obj->get_scm ()); current_obj = 0; } } else { current_obj = 0; } } } else if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - ((int)sur.get_width ()/2) && key.x < x_pos + ((int) sur.get_width ()/2) && key.y > y_pos - ((int) sur.get_height ()/2) && key.y < y_pos + ((int) sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } } } /* EOF */ Node-path: trunk/prototype/Coin.hh Node-kind: file Node-action: change Text-content-length: 1534 Text-content-md5: 390f37141c1f1c8499581145916412fc Content-length: 1534 // $Id: Coin.hh,v 1.4 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COIN_HH #define COIN_HH #include #include "Scenario.hh" class Coin { private: thSlot on_button_press_slot; thSlot on_button_release_slot; CL_Surface sur; CL_Surface q_mark; bool visible; int x_pos, y_pos; AdventObj* marked_obj; // The object which the guy helds in his hands AdventObj* current_obj; bool ignore_press; public: Coin (); ~Coin () {} void set_current_obj (AdventObj* obj); void draw (); void update (); void on_button_press (CL_InputDevice *device, const CL_Key &key); void on_button_release (CL_InputDevice *device, const CL_Key &key); }; extern Coin* coin; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 4213 Text-content-md5: bdee52ef4406411961b1cde71871c242 Content-length: 4213 // $Id: GuileAdventObj.cc,v 1.10 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; } SCM GuileAdventObj::call (std::string func) { if (SCM_BOOL_F == scm_object) { puts ("don't have scm object for call"); return SCM_BOOL_F; } else { char* str = strdup (func.c_str ()); SCM ret_val = gh_call1 (gh_lookup (str), scm_object); free (str); return ret_val; } } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) sur.put_screen (pos.x, pos.y); } void GuileAdventObj::draw_inventory (int x, int y) { //std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/Inventory.cc Node-kind: file Node-action: change Text-content-length: 2935 Text-content-md5: c0c4073f1c266a473ee88934b0658d15 Content-length: 2935 // $Id: Inventory.cc,v 1.3 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Coin.hh" #include "AdventObjSmob.hh" #include "Inventory.hh" Inventory inventory; Inventory::Inventory () { visible = false; } void Inventory::add (AdventObj* obj) { objects.push_back (obj); } void Inventory::remove (AdventObj* obj) { objects.remove (obj); } void Inventory::draw () { if (!visible) return; CL_Display::fill_rect (40, 40, 600, 440, 0.0, 0.0, 0.0, 0.5); int x = 40; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_inventory (x, 40); x += 50; } } void Inventory::update () { if (CL_Mouse::get_x () < 40 || CL_Mouse::get_x () > 600 || CL_Mouse::get_y () < 40 || CL_Mouse::get_y () > 440) visible = false; if (CL_Mouse::left_pressed ()) { if (CL_Mouse::get_x () > 40 && CL_Mouse::get_x () < 90) { coin->set_current_obj(*objects.begin ()); visible = false; } else if (CL_Mouse::get_x () > 90 && CL_Mouse::get_x () < 180) { coin->set_current_obj(*(++objects.begin ())); visible = false; } } } void Inventory::init () { puts ("Registering Inventory functions..."); gh_new_procedure1_0 ("inventory:add", &Inventory::add); gh_new_procedure1_0 ("inventory:remove", &Inventory::remove); gh_new_procedure0_0 ("inventory:show", &Inventory::static_show); //gh_new_procedure0_0 ("inventory:hide", &Inventory::static_show); } void Inventory::show () { puts ("Inventory showing show..."); inventory.visible = true; } SCM Inventory::static_show () { inventory.show (); return SCM_UNSPECIFIED; } SCM Inventory::add (SCM obj) { puts ("Adding object to inventory"); SCM smob = gh_call1 (gh_lookup ("adv:bind"), obj); AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* guile_obj = dynamic_cast(advobj->obj); inventory.objects.push_back (guile_obj); return SCM_UNSPECIFIED; } SCM Inventory::remove (SCM obj) { puts ("Removing object to inventory NOTIMPL"); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Inventory.hh Node-kind: file Node-action: change Text-content-length: 1550 Text-content-md5: 1fea7fdf5e8471aab34b0ee91b408844 Content-length: 1550 // $Id: Inventory.hh,v 1.3 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef INVENTORY_HH #define INVENTORY_HH #include #include "AdventObj.hh" class Inventory { private: std::list objects; bool visible; public: Inventory (); virtual ~Inventory () {} void draw (); void update (); /// Show the inventory and allow the user to select or manipulate it void show (); bool is_visible () { return visible; } /// Add void add (AdventObj*); /// Remove void remove (AdventObj*); // ..:: Guile Specific Stuff ::.. static void init (); static SCM add (SCM obj); static SCM remove (SCM obj); static SCM static_show (); }; extern Inventory inventory; #endif /* EOF */ Node-path: trunk/prototype/README Node-kind: file Node-action: change Text-content-length: 197 Text-content-md5: dbdb498d39db4ef4bffd25bccdd5646d Content-length: 197 Advent Prototype - An Graphical Adventure Development Kit ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is the Advent prototype, its not meant to be of any real use, the code is Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3791 Text-content-md5: 37017b2107674b78f54c87e68a826808 Content-length: 3791 // $Id: ScenarioSmob.cc,v 1.10 2001/01/29 09:12:40 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); scm_set_smob_mark (tag, ScenarioSmob::mark); scm_set_smob_free (tag, ScenarioSmob::free); scm_set_smob_print (tag, ScenarioSmob::print); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::mark (SCM smob) { //std::cout << ">>ScenarioSmob: Marking...<<" << std::endl; // std::cout << "Marking: " << obj->get_name () << std::endl; return SCM_UNSPECIFIED; } scm_sizet ScenarioSmob::free (SCM smob) { std::cout << ">>ScenarioSmob: Freeing...<<" << std::endl; return 0; } int ScenarioSmob::print (SCM image_smob, SCM port, scm_print_state *pstate) { std::cout << ">>ScenarioSmob: Printing...<<" << std::endl; return 1; } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } assert(SCM_STRINGP (background_surface)); assert(SCM_STRINGP (colmap_surface)); obj->scenario = new Scenario (scenario_name, SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); std::cout << "+++ Scenario Pointer: " << p->scenario << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/data/images/key.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 2201 Text-content-md5: a78cd8f612c1c6a8178bb96b9143660e Content-length: 2211 PROPS-END PNG  IHDR1S?gAMA abKGD pHYs  ~tIME:&IDATxXMo~.).w+iwD!rЏsO9?Eoz+zq{) Ej!bHdY%wY3Tm(J^`@r8yy;Tq*!dJJoa=sJ奥麞NnF*/Gs.e$1 `Ν;YYYy_u100@.:jgW﹮8RMM;;; @WZ<,]]ׯbjj RJqutٜk6s!B˲\۶|>Z}rr}_B&F }#S!D>`ll ׯ_$LD!>x i(˲`TU\__绻VgB"jM 0RP,oJ)+RJrt]Ǖ+WpM 8x &''1<< B4Mm~ӧctmѶ(l(,!~b6":<ᜃs~4M%ʕ+z*FFFNy !I)%2vrm}vv4 B&9==}Wq1B|:1A5M:::MӢ(,={390GR~-!pa8888:::jڶ]BdqR@2o8iP!{>22")jJ)┩%WQ*---|oMOOklhqxjm4eYkO$pBUe0_9;77 akk 1fGgϞ~ q^!wqj,L= f$c\)oMӜ/qcuueR*v1TJ%M'  ;ϓ> f?OTJ94<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); background8 = data/images/background8.jpg (type=surface, x=0, y=0, width=640, height=480); background8_cmap = data/images/background8_cmap.png (type=surface, x=0, y=0, width=640, height=480); background9 = data/images/background9.jpg (type=surface, x=0, y=0, width=640, height=480); background9_cmap = data/images/background9_cmap.png (type=surface, x=0, y=0, width=640, height=480); stone = data/images/stone.png (type=surface, x=0, y=0, width=86, height=91); key = data/images/key.png (type=surface, x=0, y=0, width=49, height=24); // EOF // Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5572 Text-content-md5: 5ecd147bc87f2094323f66691a7e897a Content-length: 5608 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules (ice-9 getopt-long) (ice-9 string-fun) (oop goops)) (define *current-scenario* '()) (define (scenario:set scenario) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (adv:set-scenario scen) (c:scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (adv:bind-surface obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:bind-empty obj x-pos y-pos width height) (set! (adv:bind obj) (advent:makeobj-empty obj x-pos y-pos width height))) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) (define (advent:open args) (cond ((equal? (length args) 1) (gopen (get-obj (car args)))) (else (dialog:add "Don't know what you mean.")) )) (define-method gopen ((obj )) (dialog:add "Don't know what you mean.")) (define-method combine ((obj1 ) (obj2 )) (dialog:add "Don't know of to combine this two objects")) (define-method gopen ((obj )) (dialog:add "I can't open this ")); (name obj))) (define-method gclose ((obj )) (dialog:add "Don't know what you mean.")) (define-method gclose ((obj )) (dialog:add (string-append "I can't close this " (name obj)))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 1761 Text-content-md5: fc12fc8eea900c3bf6c49d3368724461 Content-length: 1761 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor2:key "Key") (adv:bind-surface outdoor2:key "key" 286 416 220) (advent:set-inventory-surface (adv:bind outdoor2:key) "key") (define-method walk ((obj )) (c:guy:set-target 316 416 #f)) (define-method pickup ((obj )) (inventory:add obj) (scenario:remove obj)) (adv:define-object outdoor2:way "back to gateway station") (adv:bind-empty outdoor2:way 560 400 80 80) (define-method walk ((obj )) (c:guy:set-target 614 439 (lambda () (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 25 433) (c:guy:set-direction 1)))) (adv:define-object outdoor2:way2 "WayToDoor") (adv:bind-empty outdoor2:way2 585 260 55 40) (define-method walk ((obj )) (c:guy:set-target 618 326 (lambda () (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 35 430) (c:guy:set-direction 1)))) (adv:define-object outdoor2:plate "plate") (adv:bind-empty outdoor2:plate 210 300 40 40) (define-method use ((obj )) (dialog:add "You see a plate")) (define-method walk ((obj )) (c:guy:set-target 232 397 #f)) (define game-scenario:outdoor2-objects (list outdoor2:way outdoor2:way2 outdoor2:key outdoor2:plate)) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 2077 Text-content-md5: a7891700a18ef7fc319e9547771f97ff Content-length: 2077 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method use ((console )) (dialog:add "You press a button but nothing happens") (dialog:add "Maybe you should place a key in the keyhole?") ) ;; (let ((obj (get-obj "door"))) ;; no need for get-obj here ;; (cond ((closed obj) ;; (set! (closed obj) #f) ;; (advent:set-surface (adv:bind obj) "door_obj")) ;; (else ;; (set! (closed obj) #t) ;; (advent:set-surface (adv:bind obj) ""))))) (define-method combine ((obj1 ) (obj2 )) (cond ((closed outdoor4:door) (set! (closed outdoor4:door) #f) (advent:set-surface (adv:bind outdoor4:door) "door_obj")) (else (set! (closed outdoor4:door) #t) (advent:set-surface (adv:bind outdoor4:door) "")))) (adv:define-object outdoor4:back "back") (adv:bind-empty outdoor4:back 0 300 70 340) (define-method walk ((obj )) (c:guy:set-target 0 426 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)))) (adv:define-object outdoor4:door "Door" (closed #f)) (adv:bind-surface outdoor4:door "door_obj" 310 31 0) (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))) (define game-scenario:outdoor4-objects (list outdoor4:door outdoor4:console outdoor4:back)) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Revision-number: 33 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 24 Added an inventory icon K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-30T20:34:21.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 4248 Text-content-md5: 9d2950d6b1b92c664fd241fbb558d571 Content-length: 4248 // $Id: Advent.cc,v 1.9 2001/01/30 20:33:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" #include "Guy.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; // Debuging on SCM_DEVAL_P = 1; SCM_BACKTRACE_P = 1; SCM_RECORD_POSITIONS_P = 1; SCM_RESET_DEBUG_MODE; std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); Guy::init_guile (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; coin = new Coin (); // FIXME: wrong place to create this... the_guy = new Guy (); std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; inventory = new Inventory (); //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { //std::cout << "Looping..." << std::endl; //CL_Display::fill_rect (CL_Mouse::get_x (), CL_Mouse::get_y (), //CL_Mouse::get_x () + 16, CL_Mouse::get_y () + 16, //1.0, 1.0, 1.0, 1.0); //CL_Display::clear_display (1.0, 1.0, 0.0, 0.01); Scenario::current->update (); coin->update (); dialog.update (); inventory->update (); Scenario::current->draw (); coin->draw (); inventory->draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/Advent.hh Node-kind: file Node-action: change Text-content-length: 1384 Text-content-md5: 7674379c40376d0b19529e8ed850c3dc Content-length: 1384 // $Id: Advent.hh,v 1.3 2001/01/30 20:33:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENT_HH #define ADVENT_HH #include #include "Inventory.hh" void inner_main (void* closure, int argc, char* argv[]); class Advent : public CL_ClanApplication { private: CL_ResourceManager* resource; public: Advent (); char* get_title (); CL_ResourceManager* get_resource () { return resource; } void inner_main (void* closure, int argc, char* argv[]); int main (int argc, char* argv[]); }; extern Inventory* inventory; extern Advent app; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 5284 Text-content-md5: 530c37d570894380d7a5efd1de5f744c Content-length: 5284 // $Id: Coin.cc,v 1.8 2001/01/30 20:33:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin* coin; Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; current_obj = 0; ignore_press = false; } void Coin::draw () { if (current_obj) current_obj->draw_inventory (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::set_current_obj (AdventObj* obj) { current_obj = obj; } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 0) { if (inventory->is_visible ()) ignore_press = true; } else if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 0 && current_obj) { if (ignore_press) ignore_press = false; else { AdventObj* marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { GuileAdventObj* obj = dynamic_cast(marked_obj); GuileAdventObj* cobj = dynamic_cast(current_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; current_obj = 0; } else { std::cout << "Use: " << current_obj->get_name () << " with " << obj->get_name () << std::endl; gh_call2 (gh_lookup ("combine"), cobj->get_scm (), obj->get_scm ()); current_obj = 0; } } else { current_obj = 0; } } } else if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - ((int)sur.get_width ()/2) && key.x < x_pos + ((int) sur.get_width ()/2) && key.y > y_pos - ((int) sur.get_height ()/2) && key.y < y_pos + ((int) sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { std::cout << "Use" << std::endl; obj->call ("use", obj->get_name ()); } else if (key.x > x_pos && key.y < y_pos) { std::cout << "Open/Close" << std::endl; obj->call ("open", obj->get_name ()); } else if (key.x < x_pos && key.y > y_pos) { std::cout << "Pickup" << std::endl; obj->call ("pickup", obj->get_name ()); } else if (key.x > x_pos && key.y > y_pos) { std::cout << "Inventory" << std::endl; gh_eval_str ("(advent:eval \"inventory\")"); //obj->call ("pickup", obj->get_name ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } } } /* EOF */ Node-path: trunk/prototype/Inventory.cc Node-kind: file Node-action: change Text-content-length: 3524 Text-content-md5: 80b9d9d42cb42dd17a40c1617610e8ab Content-length: 3524 // $Id: Inventory.cc,v 1.4 2001/01/30 20:33:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Coin.hh" #include "AdventObjSmob.hh" #include "Inventory.hh" Inventory* inventory; Inventory::Inventory () : icon ("inventory", app.get_resource ()), icon_h ("inventory_h", app.get_resource ()) { visible = false; } void Inventory::add (AdventObj* obj) { objects.push_back (obj); } void Inventory::remove (AdventObj* obj) { objects.remove (obj); } void Inventory::draw () { if (!visible) { icon.put_screen (10, 400); if (CL_Mouse::get_x () > 10 && CL_Mouse::get_x () < 10 + (int) icon.get_width () && CL_Mouse::get_y () > 400 && CL_Mouse::get_y () < 400 + (int) icon.get_height ()) icon_h.put_screen (10, 400); return; } CL_Display::fill_rect (40, 40, 600, 440, 0.0, 0.0, 0.0, 0.5); int x = 40; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_inventory (x, 40); x += 50; } } void Inventory::update () { if (CL_Mouse::get_x () < 10 || CL_Mouse::get_x () > 630 || CL_Mouse::get_y () < 10 || CL_Mouse::get_y () > 470) visible = false; if (CL_Mouse::left_pressed ()) { if (CL_Mouse::get_x () > 40 && CL_Mouse::get_x () < 90) { coin->set_current_obj(*objects.begin ()); visible = false; } else if (CL_Mouse::get_x () > 90 && CL_Mouse::get_x () < 180) { coin->set_current_obj(*(++objects.begin ())); visible = false; } if (CL_Mouse::get_x () > 10 && CL_Mouse::get_x () < 10 + (int) icon.get_width () && CL_Mouse::get_y () > 400 && CL_Mouse::get_y () < 400 + (int) icon.get_height ()) visible = true; } } void Inventory::init () { puts ("Registering Inventory functions..."); gh_new_procedure1_0 ("inventory:add", &Inventory::add); gh_new_procedure1_0 ("inventory:remove", &Inventory::remove); gh_new_procedure0_0 ("inventory:show", &Inventory::static_show); //gh_new_procedure0_0 ("inventory:hide", &Inventory::static_show); } void Inventory::show () { puts ("Inventory showing show..."); inventory->visible = true; } SCM Inventory::static_show () { inventory->show (); return SCM_UNSPECIFIED; } SCM Inventory::add (SCM obj) { puts ("Adding object to inventory"); SCM smob = gh_call1 (gh_lookup ("adv:bind"), obj); AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* guile_obj = dynamic_cast(advobj->obj); inventory->objects.push_back (guile_obj); return SCM_UNSPECIFIED; } SCM Inventory::remove (SCM obj) { puts ("Removing object to inventory NOTIMPL"); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Inventory.hh Node-kind: file Node-action: change Text-content-length: 1591 Text-content-md5: 8cca71e2bbd6b82caf89f95c038aa642 Content-length: 1591 // $Id: Inventory.hh,v 1.4 2001/01/30 20:33:31 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef INVENTORY_HH #define INVENTORY_HH #include #include "AdventObj.hh" class Inventory { private: std::list objects; bool visible; CL_Surface icon; CL_Surface icon_h; public: Inventory (); virtual ~Inventory () {} void draw (); void update (); /// Show the inventory and allow the user to select or manipulate it void show (); bool is_visible () { return visible; } /// Add void add (AdventObj*); /// Remove void remove (AdventObj*); // ..:: Guile Specific Stuff ::.. static void init (); static SCM add (SCM obj); static SCM remove (SCM obj); static SCM static_show (); }; extern Inventory* inventory; #endif /* EOF */ Node-path: trunk/prototype/data/images/chest_closed.png Node-kind: file Node-action: change Text-content-length: 6442 Text-content-md5: b4089abdb7b1c6f711b3fd4a7a8243aa Content-length: 6442 PNG  IHDR\@gAMA abKGD pHYs  tIME!uDIDATxm\gum̝}nv]c+%%A UJ%UD.C D(J!">JVHHQ#5Z BE`I{7z}퇙3uNZGZܙ{?s3ݶvnmmݶ7یdo[}_m|,& M1_k[ |?̴k6  ViYȟm$IBX$2|W( A0ϲ-丽˵=VMc1C V P0p],q 2!2rqɲza.~(FnX,rI>O裏n7Kqy<#tHDy833o|;3,qyͦ 0HT.)r!>o~r̡C'?i<(E<О'DV,"Il4MoozveY#0f.Pb@9[B!rIeضN9Y L4ձ87;9nYi233ӧ׾Ƈ>!糫Wa@nh0` B,(J >яOl6, 0,H(e>^z@xwda`&Q$i4ݲ,LN3eh狆w5m;r|S>s?Ȫz#|;'?a{{~aضmXF;nMl۞m-zuXmdYeYIqDZl~$$IB$IBq$2X?kaO|_eyTO>SO=,w1/+r|Ͳl6",0 \e8efL<"m|&IL$I1 U g_ -,,/ җD{]o _{/` x"p8 ]MMMI#<*^+A5S(HqÐFAEr9\ץ\.r8y l&c5iQ -zzN^q(HӔZx( 7/OskvP=?y4?m8 jm8p9J|۶rJi&V (Eib6^OEId(0MW%MS>+IB4M'z衇8y$N3 rM?500tA۶ˎP(VTU333j5<I@2X$RW*29Ba^05j6^0 t+++Olmm=QT$I׿>c199ŋo @?# 4MrbI>̽"exd\zEɱrQ@M,0Mqv2zg955^۶yǩj<A ^bcw_1MsPm@=A\T*1== ,,,yt:r lY1q8q$ q+Dn h> (H&* C(RI#ˑ)kkklllp~v"˲uiO077g?Yr{ym!199RIyajmz&^)>=4 I,R)=,Q@)'PdOr\Vp]89{,/2aF돔Jg8f~~'|~y#ORu]5Qm }(h6۶}_.333,// cRӜ;wf)@͠ŋ4 V?eDXu]uӢŋMTCOb]U# ͥKiqdl@z뎼}U 87ZE5qp=i,zcY֯ 2)I_j)Ǐڵk?v_=zẮxS?^Ӄ /c666hZR,GxFZ<_E&S<\MĔIxzu<#u:^yF5M'Vf4p : wg?j+Q2*0Rq'I&hrr9|0gϞeee .077Ā.ImۄaV|^!+&D#i kLq#xЈŠ $izVk?~<J2Rq%s\R ࢩǽkIK.a&GabbBBt֗B$Gj:yYt0T7>Ji0nG')'|2333O?~￟Z6IhyMsȠuN=[ONÛ\rY8$Qrx^W80h6ٱM}JSSSX5rM۶)lnnKt W ͫ;hΏc(:h48z(#C(ZhxܬiѹWT<9•+Wxg)j'gRO'?cZze677S.T*u.q}~aΟ?? YC=F{c4M|vv۶v#P^x2ARTj,//s~a d||̙3hX,VZXh8b|W-8yW9w[[[gmcw;I` PY P2 y}YJu.\*`YIӔJ?]z*`9EYEF$It:LMMjri!NgEHA@accCэjIpyN+КT`4\rI=U<Dpx+ C " "Dc۶z=MS2ǎcqqQfI`ww(X__eB󘟟gկ~0 ܠЧBAp܎H@NCP DDFieM#eJxNY9([˗/![%]/Vѕї1ѿNK.Qi6O\  mĻ.0@%*b;3JBۥy벽M^u]u5!RidK^, Bi88\9G&&&+օ2&;`K/^.&9N81MF1RYAe-^nHuOnRxƭa>J(T"f&x;S^*qDWQB]NIz*U@ 4M`jjJ<}UV{ ]YUM!  _)x{ViHV%'* zY94IDWB(BeM<>ci^o5[y.$Vyܯ׻cz@@N Y}޳,Sw^p~8:|_J/ޕ,Kyl )Z _(aR:w*DަFYQT… 9~pK hM9ij6d`2YR=Wi&{Zo5zDx%Ґ vvlmmj (c/b` Mf`HJ5}3LtЃLT+Dӗ+NCHyוS$amkOѠh)NGQfshɮ7b&()K*Wft 'RDzZ(I%vG FBGJr]9LIW\|ĕ/~ ,+dYꍚ^ J4MG(Aʜ5<+tT-zFh+J8Yz_SL&Ƕm>ϟʕ+^$kqdL!020>pt[}z$`hZőcz0=x;~ߺCHb{{+WbY4w1PWV {>EL<:iI tG\Vmu"?cr^+:( jlFf{{56Qq5})~_^}:J`V).G(@ē%lyrR/ T"THTyTUN?oFו=F}Z/%Z-5mX]Ѷm<#c:F\P({W_}+W} ˲X[[SMn> |P߮Ձ`dM'N(%2hTgD]giiI%:tA`$Ӂr؏k^~OzOPf"H}F@Y )ϟ?.1 5MC9W$=؀_} Cm:_Ӿ 7[oVnjC4Mǿxü^7`M6n[Dl`]X uLwț1zS[WEݘzH}Fn#ս3Hm9cc`F7A{\ ,c9G' f f>b;`/u}5ί:e1rA `%vW IENDB` Node-path: trunk/prototype/data/images/console.png Node-kind: file Node-action: change Text-content-length: 6713 Text-content-md5: c3e003831f5cc8e8d61d31be12223cae Content-length: 6713 PNG  IHDR;C"T}gAMA abKGD pHYs  #utIME'- 0IDATx͛Y׹W/3ӳSeCrHQ-%Y1Јql0FA<K^y ؀[ 5 KdJE!gmzai 4;җiiiJ$h躎iqe4}Hok704177ǓO>ɝ;wu<'28Fu ÐRB!?)X-uc׮]3_z݌y2kRViZ?dkk7$=ш0 XQG۶j4M85!D5ڟ>)yx$M>sϩ!"lu]z-_:yh4z*J^lض\ !(hFM۶ˀq_|2zii{+HiLNN3`Y[[[hJ@y$ y׺ R4u@).y??s3.e1Tz|fssM4Rp9&[[[qiKe$ ai i_$Ѝ_~eZE&ɓܺuz sssJ%%8=666H`gϞenn=e)q(˸KyBʘu 3b_x1[Ej9.\ MS^}U:`0b&Ӝ:u|;\~8zX*N1)T*<*QQ!P²eealG VqDr^gqqeIeiiIjqslVɓ:tH&1mSp`I4MU} Ð-4M?RI,AP>o&f]oi^uvwwaȅ 8z(ivUɲxyzNadYp8d4)&MSt]zWGDQTiEQ=j`NR!Ld4Ça&?~4HNx<& C&''I[nq*fgODZӭV @Ư$ɣ{58֓$affYXX?r_+ kkkdYFiʽ{T" 9 gbb˗/siT* Cn޼IS/4Me=~$`Dz8Xűc8y$G4N<Çɲm0duuwj۶H%%MӨVj5&&&8|0eO]iZm`21S,˒,X 8aY֪*^9ry&vE2t]*aٳg9|0^OWE~mh=}4e.r^Gߧ+h4p]!^㣩q ,p`j5|Gu,}i4 ,Shh4R7v˲0MRDTl6~(\T(A#X8eY)s4Mömu$I@ŕuE:i>81 C}\}\8*3K\Ʈv\fbb(R!D<7NDy'cʴJ_"wJH Ǐ8i('I W. V!˚VT(Jct]W'W`0} @3!7M4x`p%{JD),$eYFaH*ɾqe-N>}DCiT*jJEeYVǫmێ8[oK}(I,ˢT*)rmɥ H.ƹsu]ԙx,c$I^蘝X}|0X__vfilnn*-4i۴Z-Fz]!27oT2h4}nܸvAxIC5]q- re-X J*v4Cf_]+BjEn߯iZBrkT );;;TU>OFZU3V٫Je}2ay"R+Y_T6ŒG>DQw=yiwwwR4M׶<~o !4)~ynZ~'|qhqfz=F^yjʼҥ=ϣj1??OEep$cssn+J-2_$fA=qnkA0ofIuMֲ,Ȳhi\rgy)߿i)3vǪ.jĄ=2%T*F#Y^^VQ&xLV Cq f=)-@(i۶%I2uˌy={[e.-uݢ(Rȼd4- @N+.2)@dYa8oF`Ʋi۶.$UVكV@Ie&2j27'IdTYc\$o`6NpU70|(Kt$cȧa8h4tqԶycrߒ$ɲ uդ=I\%}]%psAx|0 {]%}U (Of$r,k6 C}ggGiI2Z,gҥe  ;Xe4M$I~vfvi(/o"C]<χ.Mϓgا>r W{\.yHaiIkJl)1VZPziZ: WaHVqe-Ex]`<`jD'Li}#;99yT* ðT$ VX6 L4/iBӶm[4K4SM$IYZUMDGF矰ⱟpd1TqOx@7M\*ʦiںE0(1i  /Mض=gƜyw$ ZQAqb^[cV|$pwe;',컰U']<M14gvM 8 Ө*T*T*T*T*T*T*T*T*ÚAT¹'S=T=WwR4}*Ƀڑ;M1!) IA-*9HN)c]j9.U5* 1vOWcRXʃSgU@T*T*T*T*d#BǰY'~zaCkG\N[hd~ U8/ڙI¨4BA )$_ڀ9NE~E tXB C9%7*l'i4up悻kk 8"rx(F=BT6klS #6PK84Qr)z ?ۏ,`B;qj5fy#۷~0S+PE,"D*|t8qȮ悬RI' xҘ`?zVA&,BLpMIK4cƸ#aɩsJ/@w}IY ^i$b}˜f@pO4cMtF Ѓi'56~AiLUU4XNTʪ?5aj-ZS|׆]_wԫ{3Fi i!v]YɺER9#ɠkK;vj2Myffҽ1N f/:Q;, N~j2iI"aKdwϥ&N;x2JnGn{ϩm[[Utd* {vJ){| }zA@؊[0 3xQӚX99.U2>wʹھ6.(rhkQZYٕRrP1 I84Č9?4T[J>y+h!j@;\.;(Q4T*0M j rN* q)jPmaZo-d  VDpE;OU,mtճPA-@h, v ).I31RPJ҂0ˀ~hFEP|RXK![Jr7 h\ҨaD/҂K4\n*.:'2W4ҡ e&r>y>96Q4Opknq|^>k n s[yvXa'5詵R`3;Fe@hN,hrPeejy >^Hf WLng+OkSpw59 *rNMqv81@M ڤ]g cRRt3kCgLh43ɅQ"HK*'"փ;~1n&dV^FjMFMMv{@鼈waUjs;.O (,㸎BUXx4?5<0=-恻[ɮϚAԞ*S]A )RXT57zu*xXR|xE3]{S nA!,KFnE{3znJK>d₺f2Pחw7 WݎӁ1{M#ԵyXn$w>(4_½ u-U7"޽Fә}kInԮ`j/_ԟW֖Ա+cDMNIGiQ72FZ8ϱ~k^^æ1H,lHERMRIP,6mERHPvguPf 6?|Ԛm hc4IRA.~cQww-Wvmcۍ;9TYR2;)9#>ߠ? 1ncfwLĊYGh_tr9朚]9hǷPr"YWܜP9,@+Fڠ,FsMv;h"KWBHTi'<E*0`En|%K;jU3—^AFA3!@+/@z4 N ^0WC3AP)?~A]jQR)dl8?h\ ="v< KhV7ڐv/ނOCiޒ~yH꣰˜A @qILޜ 7ޞ1Mюiނ|P/P|管i;R0!@ż)8$ AƸE8 9cEclP=6'ITRN@ˋ2L<^Gg:-3d W[y.l4dy9`ne䑦Պ5 |sAE=j 'qoj꛰EGoL!I@~'Ah7o 7 ee-̘k;g"8I knEJa,#56E JiPkƂjb9bKEQd ws܁j1\2ģ'n NK@=|hD(3=ED_RP`FDE>(#r 0b`B1H@4Am\Rmh;+\>Mw`4 'ޖK_.1Mɮt`)\"N8AkP*TP5W821@=ev?֐{e(}'p  c](9 =븥K94:nz9XYnkFh!EvWYRԭ¦0 g Y׭ >jW,4؜YFx ׌7TM^4s84}A7ln A]ha t2E;ֲ]ܜNsJ#nYnw~мROjWF}rco `?G#𝫆1}C Rf'~IpP:vE!.O("kb#sa.oXpƪFz^wgyW^?S^(:FiRMrB0<1XZI,Uɯ6%sOA c]ϲ/w@fNI=V1 ` t;vQx)ŏA-!޲q֚[l*G_hۈ7 9R>үlw*O[C{opy\ >Ew#miPshm_u*(Nq!%*0 1XH֟\ J,R@\+Tt *bJJfJRJRLi{CwPYǨ(,)U,Ghpf:'%6j@{h;J*JE,¥p}h%Ym_5VUyGeTKT;F? A u,jnM/Ksܫ(M=.Qcwpjr:Ǵ4+%eEHVԑۓA\mB6asPM6(Vqy~Ia &x {:Ojڍڛ܌PSAaud+qoѶv3@w\aN*[ o /Pb Hiz8VQhHˎCIq?I }3]@)-ڀ;x]*qoGciƁħ޴QO q"#dV߯o 3vNY&L @Il]]v )/fewBFz-a:ay{uqh\}i5~u34CiU&UyP@FQk5s1rc;;Y.ZBJ{_DZ$䏨j[Dr@Uj} N];M-r2AfUvRN3"} 6%\+[`bڛ2ZPWuuRx G4;Ym K j8}9%rkZ`YA.wgnU .OAWYkVȑ6GsF'[;$F)]ìcqCϧuUHAj}|uLS k#>ji!b,N8aڃrtWE=uk|yf9U;bpN;W0B7gvN~ؽMԩdUyxW&UM1DY#L3fT^[́TxW H ?S wTǟ4Gu-9؎Լa >⦇V;fA#;|SU 89nc2~*m~󝞽efoZh?òeh=y(> vz6 ͶXة=8*UP FI>7P2o۾'=,0Ag+NBUwl;[)ӼG(J((/ $Dc&s^H@g+>ݟ֯5H˧eԊX=BF9bO\_LLdH-%HۂOPh(keo䏹֝!a3@WNhußsTd?~ԜP+p*NZF8נN쟘Ӥ4Fhfc:֠@5XzNlgz__< y\#VMRu9 B5t5ZM{RPZD>h3K`f"R0#\oEMidh&I*NGXpBNJ&;XI5f4\Z@q$ظ@ {VG\ifSK  &4x]k lY<][9gdfQB7'h˽kS$$lH\qN&^c# H4* ;YXaVqGd;KnU=qxh3Ssm.Ň ԫ1$9GI`iClp{?Nf!Ւvc,YVTXbe\o%'&uYy}GvH-dg`w A;?w;m xb " \mJy]YuUˇ8(2w4O`A>(d؂q((KMrOx[{%ܧ #$*? c I4S]ٕg(ŀRche21TFlGL51ڢ*(%`MD=K?M0ΡH\$A`E:Ktp nHY{ݘ!rѩ2*ڻ7!ANԮYD@;54krhBfhxEB`\p1g0Q(+qP3T^dAu XrVsb\m97WGeg\]jL+6ށ\_?!Ǐ湴^Jhc\u{mO\'5zu,Lqyʖ n6ԮIp;j,gY"0 cqrZAairviip&!9g.0IRjxCa; lXKy &Yէ.H5u٭2JqQ7#2^()Otvϊ8WXcgs˘ۏqh[a&a?4Q`To[8m "%;~ aU@8R)dfM=h i .>WYL.UGm0GoeuvM>³?j48 \HXZ^ŊF75O&4>*QYҤD }$PU-f\d{{MYNWt>k_]\dУ'UI A8zp9Ai%];.<vSYG#;Hq1B=8!Hbt+F0jj Fh5R'K8LD]a7d1#+D:z!Gi髂G|yδݷ¸։*e3o Jm*$n$#'2{`nѰ{ڝe_ڱ$d8mʔ A>ZnBy丶 (6zlR\0Nw5o'Fr( r@36wm谫Fn8D+QB U9.-FFubrh"m-XlYPa3<ՅPc )AsAR,#$x4к8[`rjd -(#r d"5K܅yNJF@N< E)Bs@6R(tuj sSF%;b O9>(RKINKĀ8b <ӽ7fWs@)A4e$#7r({rxP: 8 yYm$QOX̑as@7u73HOԭ%M F?(*mLh!H zbKrA HĶn|pPJ3t61D(mu;FjH˴OQ4qF08QDAYMQj(pQ[QZ{OO pb  rP2W4]B:m_* Kדiw+gYC >@GdW)pa`.{3NH'tQUD` (*u{Ycݑ-'NT.q-l:=PvGN%l(lPK[5?;sVn_hvBDޡdAk4.RW =yq+]Mg,(;V"(` zmICBn?Ji$ w6z DijzMpV5\)zhUW%2\ kѨ2GXgcQil,L|HU\\=ԊvFvƧ&T~0*H oC\ZVKG-mV\sF ?+xjwFDHȣjc'[>E]xLN8RURU\ST!E%۞٠-U =3QIa"E- [ܢʎ;Yap&,)+l ґ n !zMxȐ~)tRR[obTuqSOֻ.}H`˹T1t*.9%Č*d=|g׭HߏDp'$kN4`vY ^Aj(,mUJ扷@9όѫa ѯThҙY%4fWGpX@yೊ\ ێ1YNN2("wAHWd15drU6#lhhB8JGX7 TUAAg*@&7Ky{т#mČRvG+sPGxeMdI6#Z!QQBsOK}]iƃ1OQ9; 2xF8)T9;f8 PMhȬsZ7F.j[q<e۱bk 6Eݛ38'q=KpHl {%x?EGT(a}+5pqCY\\]L=3ޤޗs8-ld#4G$̝,qUzֹoۼ~#e0yuޥ<Aus_lv[||YxdRgp9[{Kk uzx_ +>h.4W3ݼ Y}W:d s &3r,jX94(]>0Fh]^!Mn$6Չjm5AA@̾˨0^.o$qq @bۛ?v`Nw|Sn]KXْW}5ȕѽ4Q4:6n 3(8b S20NO*@ss$EJA'ZI|_r AjGH+5iǴ+vIjU?wdTC\~Պf 0[ kVik=֯ ZDɃ;m}Vsh6Gc$I A~4"(kDF%O҃]HyܰZZ _6/KS,?փu1F2ܹ9:XڼA[Ԛz>e kO{<;OаOszVop=+C7˦el MAm[6J1 ϶Gd"8E u*Z^IwŃ?Pbmd.21jk:@YNKyC N74DJnYBp@s%Ȑ,cPv՜vo<Go5kh5wHzcU]k66ђ%R$ʳy&[F0ݲ]ia]h;A匴8 6>(.\(Pj CY$ ǵHT;+n*aOn(PGt]>i jmP#(XF[P#\PyvS,"Pw#5ܒrgWFc\V:!@G"j+n2*y\.63ɠ kޤc6g檢,`~ TzY[|APk{B O~;Q]7ky-4bqL=T]#vϊ\ܹY >0eZ{=NTW)c4vR]БESMwA]p MKkKvU*O;f[ E1mlshx]CґS`j $TxߔEE5;@%îBR r뻮Ag1v쾠+h 3[BdRpQu iL|UIu gl2><&s; 85^Șag>'Yui!6XGr 3fNu/^"Z mbcVKtB ǸP[w[ t{;X]A}F#zjM7xk/Ip!X<)2% W$Xs,uJȻT--dUXm5 G8^̣3cDԙ)7VS}l>xMH$Khw62I"mqZk~eTmv w4+k[Gv Ւ޵<Hhk+{;qk$jWqcqb[y<*k_[R1ڌn(ݔ;{@ȠܒI$\5TE!9c5ts`5)`)S\c6 s"F"y7fL]49U+SjNl +(&ԣMrL nXOƌPƪ%A^-NOffO7c֕eۮ3Fok {lS%uLhLgⅳCl9QA#(.fbQ`-栽TuV㚰+M6QoXp|PRȒ`N@_ᐱ1V\;DΑ(IyƬw`h)OμT 犵}.Պ~ek)לUU‚8lf>NwV+N=J8cM]Aԏz۶rшe߼0Ȣ-USG.jT)n}|Uv_S㴱튱i .־xUUxǚNeB99 uK>05.ev*̻ܖHr]yim?24?*koZH\1CO=FHm\WTҭRV-H'l>P\-bM6xǚNis$;B@b-mI2X~jN[%8ޡ:^416@V2 70ri7M4+8y64qݏ7vIq> hHt˅'曢[5Į7Rd xCT9y$'⃒鱼vr<* uWVrܯvd  r]' 2#RۨV9[*'^OM3ڀDYFsRߤ޴j6B(]64Yd-DQأ|4^F+-ȒHZ-^0M~6)3>x@{BTHQ<~?Pk? B]ڥҒf|s P6YoU@J*T=%|3^#jqh+SnRd!1i$Y3AX#BUc l)$pI &PϚE2IϒV-`@,9!;  21K?p"i%\߂E>#4ͭ3sJ?TcG fetcC{Vf  [Ff^SM(G+@[#c41Ѥr}%8A#6v˴*%đUϑWi[%c8H.xWWO~hI GqWO{^V#5 dq2|19ODfypTXIS,Mk#9 ӣMŐ|ԳmvA2[ί >##40Ԓ[첡dp*{h lvₙZ["Q(u@N8oln`wv<ʩy-P28%G:xu'B8`OqWv=ꒊʿnuƉr0c&-pWh}` ֲ.dTw=5<"k  NtPe^Mnt]m55FKq{!,*8t^̳5 9Rꨬ$2JpQ6iܒN3V:/ y'85MR +xX wG[gRJEXO G_.u"Ls$= 3NȠdkH(B[!CVW 49 .q c2+OtvA3F1#P_ Va[H;Tv.6u-BFfb5%ՏO;9dr z-ݔvKGu1 y;`UQA%ƜhL= q減8-3Gүu}-s@KunU>6mDKVVGyTlU 3ewɧ\ ˄1];CY[DH.v75a'VtBFinX)Qަ(YT6qT3+J5TD9a( Ov{ծ"PgjФqs"4nTmFATa P@}v3p0<<=sNVarM}p +8J\@Ϛ'^>ߝ4\?;_LGJ qmTqB=.ĎO_Q-I1qPiVBP $(6&QdzN=Z/_ڤ#?TlfmH sJ Ro"c+g_)@9'5$=s(󕠿[QCJZ8}r*LP NG*6DX8AUm|Ssa1Ts2ѫ֚۟Y(4Z̮)qtu1tPtX,p(42~ W#І-< (Sm Fh&6m|hߙ`u@V'P63ȧ}t뱚Xi/dvbE$UӲ;I{d@plnQQf7m zKcakf@P\!/;Ӧt`lm䚤{AdRـ$8<b.kVS犍nlE#dg&Si".HGYP_kg< +Ijfl2cAM{ c#9{{(]s.iC N;dP7v ຐp8,ZT]]1geL5խ|H2A]>;Ɏ˦f9C-Ydm#7j5 S̤A{6ro q8Պ1foa>jcJRyB29Yw@$:ٚ I%q_kbF W3zVUfi@C2KkK(ve9f#:.ˆ˞w5Qn4ƋaT`^;H en϶7_ՓLw,bRu@U$c@eQ$>E$T0\cWWc}Z}.p15gF\}3A~ج}IVejRkHHrأum!Bv;rql8X٪ܩ( ~s3]pxO,qe;yCWAdDv?\J*'-^koMO]F\s+vV33w思sRU6j{|qMp@ ryώԺQT]zCHq߬]MȪ;|u(7+\sRhwWG%IRz 'PLּn!t1sU-e6ZB4T{]j.ux ,jBW6BҨ.!ίp_FOf\ zZ|όq[ w(qEӖmyr?Z"X~yyTpg]GV+OR\^3bwc[DZ1WuCq}K(fg$xn1}~h=RtXmqz7eST `P"AkgfC85?O {gYUkOVgdOsQmvV|Vtފ^XUWZMBգ 7`ʭdQr=אթӴ- U~\w&=/@nEjtK;r@ϸ֟RԭF {}k+zGۺp})˵a^ ճtCIf{}8T (j[\ҠrλgˎX%~km]WPCDدB.wyTI{(<nbW_sPhwIU w/Mb yEW}sCfZ9*_#??F8pr~Z EMXX{(<:& | *ku-V+!=k&q꾔1oփ5a7FCmqG@ƪ&ElRVSO❩j\>́A&If/$0A'5SԺaocEh[ 2tKm.W#A?V>~T77@pW:xAX˫ENFk}eB_׭;u7S%)9 tL$bܠ7}9 >HF{Px]n++ڧN}3Ʈ݁Zki'gnڤ缑{TA{vumJ:LxJM'毤-.QQ[%x5귟$D WKX*L?aX4-PFeO)eicoErN?7;1RQyPj.n$]2ABt4=̌ hynutbOy32wӚ eƥIy 3橙{fY5kzI$h(SZ> $lP 9@]=fc; n\Q6gw*O҇k;` E#P98 f=l:fFrQkgrmqAq=v#_89Z٥{MLP~RKl ߷4wumΤ(IR%ogQl89?zirZCC޾PB \^LOI@ QtVWĦ}RP}ऍ AT^# ޮ{ռ't*qAqV.>yghf䃿oh^K€ |]=Z8ax2doZ鶯={֨FF ~yc;\Op vϯ+5ԗ G Ƅ@+GX7g&g؎"l)P ]RQ! >*Xer1YvֆiA9ɷ(+8]t &V LU 9sh4ǣ{AJ=#:Zu#?W*u7m#ھsF^clJB^S^OEɌ7/RYkHQ+8T lmfs?[?FKUP$f˶99Yh]ZHc2HeY'rZ| * 2{eIʨ<~>[36A6 u}v;$`nѐ(cZr ot9XnN]90bY۲㵌d GP{z=>/JA7Qi, x:Ժa=2N{~&*Ò+ie+(@BI* c^;.R1gWsR^ .hv|>W*im""(wz劅JTd vI \G uTvgԸnS4j.uF gi8=E2,噉8CtM*X]?LiVƁUEdu~6j94RAdޔ`{־,ʠ*m%27Rq$6֖ bG惐[iQR4Q++RhּġbzDӥ֮ǩ-nGtއ>|o ղǃz4Q$1P2;X8!#h5U fWpbބn..yn۽F XםZ,D )_&ٴ=&KXf'0>+Cwum<F w5Ui.AjUj5sf014oT=Vʓ==Ҷ%̒7$8I$Zt*Ub3f6VI>(:GIڶ,?3[֡^r9VI`Ӣ H7ւ#C}iǩ3rKs>P0(PoZ.y5l5˷ս0s3Pw2nVʓZ( Pl\ dfAao*b5f}VӀMO < ޡ [ٲO`)ov4*Y|۰튻X!@ ֑4;7xu7 ^)Fhch׋Yoo&2F_hz=ֹie@Pk}aj$=5GiiJ[銛Qfon qA% dn29[xǒMi0yn(ꭑki>aٛkp\Qb*4df%Aiٖ4,A![,T.3W=h:VuЇGbqȯ<2u`?Z9MDm& e'ZN'ig~hҒs'4d5ךH.mv; dzlQbQ9l|ޙtFjSgh|ӢSq2˵s$x4~7-g48Q}IA20+}WE%x:-fuxݤh#8z6\*zڝ+QT#?F2p{j;T9{5kB`rJIG- uPecil!>hk 3nzy =W143\)!N~N qiQƱ=K^jʞ1Cs?OXg4;OyA 8ph틂=LHA;F 6~Ցz{ D?iouiQdB"ҵ6+ȡ3ibz+VZMŧ/;zӰg;I ٛ4y*;HY u.,}Gq,2YњN責SqV%Τ&n쬡cNKxS}wP9:l@CJ-bc}_RFFcҋdiEE t}\P pqGm@':,+F#棫G d|PyuGq>q }YFp3ި,6.UG5ӵ_A$%l`N~{@>+Eo*kYdlsZKkm:$.yZ(rxM6$؞v^YeT;Pd.3dP>ڕUb}kd7WNXqמ56>h%^4 2jKenqbZkF[$A.,ly-Z>@g|«>p_?jN}TGpϊzS]GiVbK]Yn?S<2xVQ,a߱yރAoѥ*ڪ^H9ccEH[Bޮ׌UTj:ݶ fmzb*&c-Π8ym 8#ơTxXC,0Tepͽ}fKn~;ֆqjI$GI'Sh5$sv= #JuBnnb+QP}m3G+y:?O '{[KU8f=ideI47Oc8j[m"/3;zXvJp|z}Ժ[[`}h4M+dUn 9 BZF[0=ǹp&@5GV0D#PMki))(C3"_ *vnl@4 Ma-h=ɡu=f+e(\Ռ6p TiTzc n7Zw;">'A#uj85;h:B*#Ҽnz+s'^6B`[Hfڞ3{c;[ȫ;xVq #b@cWja9Tm /ɪ{=Z{<(`M1`w\V(0=j]C1wD0V&VV欦mρT |W&YiCwzurkcȠekY' VL` mP-Yq'uIw},;1w:>3޼e#YwYH! l56Ϋ"bhGpvP^j 0X#-M0€mU &ph,:V$w@1U1jZe R+~mK b0*.xO@-HOYu32zO݅o[#;E etA''˵#@PKJn9{A$*3⪵m~MeJ(UWGgn)i O;cP7P-NԿJY[?OMXaPrj[[X!XP P w*2Wi{JzJڠOƯuEYcݕVXHbX0VgpFjpq^-bc$]|s^wۦoDvy<E^& a'1ZQ$84^Genn& r-"F=m$jVuK, ל^uF诶܎ԺJ!;Z;HN59G4zNĀ UP `H%¨]1Tu *h(dG^{EUh5޵&edҬR]im;x#PF(+medT5E@䚊R[HZA"kΫ+=IŒIiYF2 |`nm-TP՛u5Ν{]is/Ә<4W:HV嚁h$V 5>CZ<(um^>CA4}NU|Ǹ,.EVw ؟ҵ@,q  tqH V::e;0/yf4@䚤K6Iª'\5Qi {_&Ҵ+9PrF1AmJ!jjX4}F ɢuMJE9**Eduݩ~<+}t[U'ը}|1\aŽL +3[0h4)aC>8\♨D=EzqGb1?J *РЊH\=6f<w[TwRNVQńj0G HvR'Td'R9?5cA}PZNO=\LРbzMCX{pLIr$5M%ߨn|?5mqr%4fs ;@8V25F+Ildme:aZE1`3AJ!Bejݜ.\FmHI(8  'A& !c4nVF2%`ybC9=Wk O l/=^,OOpO4RT=j"+(1wME5лpD{ yj]Z[F#WEU*)?ԺkzI? 7Qip`-jPd[|ȝ$M9V4g$<*TLQuF;Gק*6i?KɌI=5a)m0if3P7!d([.~手BsGmXP1;S? Oƙ Q0b9QjZCuXӴf亶$1tFTiy\sPv(f;Āg\4'S&8[/["n ;Ul,>^IOzCmy6F@Ag:%V=1(h@TF'Mg h#60K(‖'ڠj V&&'"yI'~Y6i6LxtnL=6Vxٶ cL8'+:~ۻSD0 :w-ЬĨ ]sY;MbG*g1F4b0A=h42Kc'*MZhuZ ylQ4`9$tPsߊ ެ}S'bҨ4z"[H/(sh 2m %aT94zhQ@#I-Ҵb=[K gyTǧQ~l_X: d4\p1^L4<5.'T:M &=MOLv3K2>iۃ3AMƗ*VU-ڨQ6[83X쮝. [%4G~>NUXV~ӭhWԠ $c9'R\qP\XڧȫK-KL!eiski@A}XIPsA}Mknϝr?Jmo4PlP?gfu@9\y=FP;,*7bOjXN+Ur);GjiU#o5 ; MD#}vpfoZqҷ , 7O'v=+uNo.]@اW ޸f) 7z 9ƁH8ݎyTZqZ=̊NddVuMZHpH^wlHF s`N nZ Mdb*z*?-fEnHۇ5uœ{ApSV8(7<PZ"Tk3' fc/" XpUDc?J%m䕹 Z}Egd#y6/lW,6&mt1OXm)ګlqN6Q9m՗b. s&ᦑc %Ș\5@$Gw/eksqVOPMXIg9P*3ڴÆ Ire8ϓAY@9|n#4+(gY(qK,MYϚ8<*<&94晸~LsANasWFAn'B'LӌL #{sA(y<'m1dcW;;SIR60)+<) JM,~QL>3@ט*<>Sv A$IAAɧłc<𦜱7o47:lDO"[&HgH"-]ƉorI~(KVv]R~4Ӯ- TMirrG"2TuΡ&Wdd;O^Qu[2a;^u/VCrr۞FN>yΒi<z K\jnQxޏST;4uIiկ$I(,~ra:ծ}T!yx"XmݘRgkdnQn[܏b.,-!*YYu2$ @޸A0^s(IC^1[x&`D>+/Mi|ZVo 3r+K~4 XƚDMG֋NWT7|P?Pw[8f>'R̡"BYR"9Ȭ a-SIncFqww`^df ?5AMD :2{4vwPTA5($C XQ5߃7`ǀ(. !ڟ+̐u$1T>֭u}rHGy=ꋦ.!qp?4dޣz2IyV0!y"-7 @+3nICswk1ǃ PLq<$~UXLS7|('TBG@f9qj9+ ?L%[GYK=Y%*~Pysl~ۘ+G5 [ZmǬ(1t͛LmA Lۢ;;X&[;V,db}6ʃ5uW %c"0ZF+wy .'5;njըSӦdt Wuj0ۻ{[%J F&acP r4ѭX 03j$ktBN$c9EPT[@ {mnEwA[tp[z(H,D93VJ0 rkY $I&pA%@Р V%hNd'1jYmU/lX'W~6Zx[&0N>+mf1<~ Ā{w;IdXB#4v l  :aU" > aB[G,{Յ"w] S@Zݿ6P1Ϛ;xW,OcceW'?z[SawVP,S! ȣ%ԘHH8%fi\* 4 48Kln a ?=5[ 3\,zjBs+=qoԗ&LOo8,9$&sA8tS#>D"H;kPt6˷ ov[XI-J{nیs[Xh1ɒMZ#)m(Z۵ͤ8yZ!N$(\,qPfipMJ (<.#\ M.#woڧR w5ȁ@9Յֺ4 9R' nբiF< kU Oq9وf9+<`UqAolh;fTp~*dk5FpFAb;b[5TD,2곂au[ +`ia5@ȇ[>("Lu  iY0[eT( Cu4}E )ގz/v3h LTe>F ;h]U.ƿYnn zg 4U1KKu(?V_ e͆?J='NNHcP02~EF˟OMQ/7@s:="{TjD ba&c恆ڈ; xlnHN,qsڤxGj gBɫ'I@b@#aD0 uxƁj(A_5)sT(sR ؓMh%IEXdgOݻPTBV/KDFʧVLVтFyd`"a>`2]h,ayܩp[}[b AFhlE13,0Pr=";c yY51g,rpx_i49f N@_\%7!r7 cAjxuU4Tpz i"2l ǃ,4hҢr;qA|趯1X*bЭ3^?y[kG3ˎݪanTփ!ܴ]d>H0G+ }> |Z~en }7 jeQ#з蘜m'$U%ݷsW^8$?jQk-!r>cJ^;IAk5& ,Kj%hpT/, }qq]k7CjiAm -8̍ێڣ$% T _RTsBAKڻf#4Jq~*eڝL3@SNi OWQށaڤKqk(NI•4xevh"5GcO0sޤbҧ084׷)\&wj7B 8ƹT될S Ozc5.|R zE{6F;80wF;Izb/E?;R;M= 9Q悬Ǚ;dp??ՌaaAVa84Ʒ㚱-xZkh+ c\kC3Vhx᜞Ƥ[\~cV9rE>֧Q .qB2˭+N ։-2ZucVFC榄>|Py5*My?A6LW6M?4-l( 9gII5NBx1eԢng x(7ztIrS$gE++9s. I$`M#O]59[ {kMOj DF,gȪ]9Ɲd v9{֡. ~nd8` |AWk`Jb>j{Q16f7#2~"%v]G?HHHA.Vn'H+I`?JQrZmZ;FUBӅTVZv\0'nViT·{@e]vX~k*);,&CrB52,ڃ]'4;i /Ef5&Vv8ԵY-b (Nܶo%OR| ᲍NWtFT dG0ܪ_@~⃴RT?o>'mU#܏q֏⹐i8y<6jO҂!ښ \ԛAT!G$|S? XԾiOp~F()?&Japt-S^QAB,&B=LUȄ/GpI8Ϛ [9OSU}?"ZpeU" \m#FJp>Bŀ^0[#mmFݏ7Ú0*ң6}Imv@vU'b5羢wt@bnL=~SR%C{kԐdRx(Y}ȤLM6ʺ dj1WAs(t=<񚹅F2G5Cg @9>jU+kLJU-T(}>(3 Fx9#*oM@䊮5"o&ͨz@j&OH)9h26|Ѧ {}s]8(6#H#T_"Gv@ N{H܃r E@0 PJOԞydc2 3޺ :4n|0M/QMBw5ͭ+x6{#x db\Iؚ h́iu2`)4jU 1ofa~}elM)Vx,6oo)X`!Y[<ɣ}SekAAdr+&-8sCٷM`x\޻kwp"ܟH ;Ӵ8LnA4l"Agy/5[?r+Sҍ%)b1ZծT~[r0-51l_>zSM2$S5hru*TAus,TdԒH!w`;^W}S뱳| \ m!CڑpIgS `*V$OYnpEr)h&gi,sA`d;jUC){Q1Mh 2AR"Th7(8IAhS8 ۏcA ILixbӍcA]{W sލk6C= Tge!k!=1jM48{I4i"Es1/b)L8i,d <Աӿx 2M=?gd"|d/ph#žN{[,x #ԑ"h?偁A Bg<S戉{*9!ecv#VVXm"<ͼ `7=7Mm)bmͻhM! W9%s>t5k@W3Fp׃PGB`VNSxvY*Y03rTT}WAH79[4i2Tot*^ څ֚rJzKC%*@ݴ0>E톳g~Ґ=Xd+ 2kYki6p[mlDn Am=Zb cffIyŬM{xe">ETSz3rۛҴZNK{y"6XF3psC85 /Q,œԞT֊=>3c5;'x znG?zӭ ⤊2|PeEpحK[(um4Si(v5kwpkMpPP`{vXNJO!)#r84%}fs+I o%M_.nX *AW7PP,N8ևZƠzPʷw `?qni4zphbO4o+O2U):84Hx'E@-yF{P$Q椌Gzi4e'4LcmaR@-g|T\P5]q8N!A5#4 VۍcQ` tZ= aSEz ƈDqNʎ3@74(O8ɠD>)ޘ@C]l=`+`B-s|TI\qN=đ~hN L(MPNʉTd;IÅoyPO +{vC P}4IB{R ma'V}&ՌGjtֿ a cJCA8m#i Node-path: trunk/prototype/data/images/inventory.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3073 Text-content-md5: 16dbb57f5bf5eaaa8dd8f6b60a5def6b Content-length: 3083 PROPS-END PNG  IHDRODjgAMA abKGD&x pHYs  d_tIMEs IDATx{m]~ǜ931MzبF[%(( ?i$m?hLB"_J -FӼso{;{/89s3Sw8ٳ^~Zk'n,}>{X%;~(ݜ^(h#{+a0|/U xSeC](^plp^r@x 9$лΝ<hؾhp'L屝'Xu WZZ\;Tj@O&ʔ8mN/Jc[..tDj4QiHe H)GeժukGoT"Hdm t4eT%;1UTUD}yx?+/==#LK +*VR Ql46DZ0 J#CRAo^u=v774QXuܦi՚2m F*ccS14bPƫ `*JT5 ^>6m+p Z*DCCjh  xh] 6~/\*xL%Y9nI6|І\pTjD a0Ы]jSCZW[{W+Mjf[uUM\L&B,ْ6 T\׷73zضj%APK\V$З{R &&&vln*oss;D%Ֆx%?w>ʝ~Zneg vЎrk`M;I0oEO .JMQ륁T=x餓.Z!'ld˶u؋.ZwTWe첑$j&z]s[X8ZEZ*U);{|4: ]NJMo$>Rp(j\S"54F SBbc%G{o[01Ue]M%:^wKr n3HU̥\xc,꧔J*w=㾦42U۰㌡I4d攖JZ1f&/c@T>'t\02kcsh9rѦM,WRǬ:ВL\-<$KT!44$JZ"a%l)ihXsASnq0RQv\]4F, {AH$a?[6n δ/ш& R 5\kͱcYkk!8ՏD.3@%S\^F~#Jud&1앳VM.z]í:VT4.Վ%xt2ZWa@eU}JzM 6Sd JAK_SYBi$4>0_a84єK2D[VYoKY5/qLHL#("w~]"9;Z |M c+6|u8ӱD*15vmz͚Tv# 2g tdg7hI՚z:R\1yf2wh)a$+2]$^+]Җ֌%Y ki)s¿gH-끙̒l.hj BYsXRqF%-F()g@hPPFq˛ew fRkV[1kr9t좾m/\ub#d񙠐`*^}ԞovsIT~‘ J| dcp *4V FwZh S"ԩ2Ķ"mil=Pk))ib@9q_kNXʬةT6V(<{L]9U%rҺanuE28N$|&j M#9[-Q<4Uyߌ,-B4+ҙSnz4Qch;{j+T6Zh" 'W9D'Z)*O{^Bޚ=3[4gV[II9~2jX&ޥwEi^R":蛻^[zc< W[:r{WoJ_eL&lNȒ&god MM--+V#h+zstN8.݅rSu4Mt"oNBZ}1O3f< t5{ ]-1uARW#ny#G#Z &1J=s^2$4ʣf  mlޱdkNO0Q)#Jtw= rbߩc4I*o2J+uIgg-Xb]nS r\=rGYKtdֵuܗ~J coĎDnMP黀\6Ɲ\bG혎Њ# M+ѬAǿ>l3⾏|Y[2ոjkh/ RPzBk J/]TRϼS}}!Y߼]p8D}H>y[rN˲nϜ:s6g[YT8hvA%sP?CuD+ܘpa>aZT2+ T2N!SX9]dbpMОYpBbF"2 @P), ^B"K]'3Ql82ޝxa+3OL\LA`Y]%'8d8iFfb)^wq/|+WL"x:(QJiɌQ iItB&)To;8GBgy߸򅉙A+F DPG:giZh:Op]`-p=511W^o(462s'S8N'Pp:ȄF=&4nxjw>O|g^6Ac+8y@#SXX):&&qOwDL2saD$xW~W7"`Wj ;]\F`SSDsC]ŝED(_U/ _EQsw2Odf>es*qT*Nh*2+r!h< !Yߏ737<;+;ETTpQO9D/i2o3o&`g•|W.Uyc%0Sa3*9,G,ɊZe%1S; @5x:]E&Gq#N`R3wvBטT E"|W=ՅG< 3 xY2wd7#JJ;PZ3^h (iЬv>n.בTqhSDH5X'( 2YLm.,\JlQٸΝ;ʁFE)sjTYfi(xnxiA8&ګY0|1ꪉLR5fCy©KIz `D!'LGVN; D YիmDNb2 6(gQI41ƫs܆uc,w DUi2]lIY* o8:԰*(*Y.j[}(-EyWw% ;Ulh$llbCWk:1uE(kGOIح9 ]@Tml'Si"6Mm!4-)Zpoldw:E`:+r'Lmaf͌Ar|٨fLpLDDe⍛Ǒd{v;;wC N3 ]0[򇟉.I-\D<;»r$v9qpg0C0۩AfvVJC@+ݚuD`'HTy;QTE9OyT,1CA#G{6Vf H'I2gޙ^nWbWvmZt4鄧[Wg&-iNB%,8`qeV<,bR!rq֔$uY`"@ ,zg_v,YvغEIt㠪l-RrKgl;g,[mG]NeXu!Ldf"a"vra;P?udL~8!3tXv~51]{@ _N^Z3{-U8X?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); background8 = data/images/background8.jpg (type=surface, x=0, y=0, width=640, height=480); background8_cmap = data/images/background8_cmap.png (type=surface, x=0, y=0, width=640, height=480); background9 = data/images/background9.jpg (type=surface, x=0, y=0, width=640, height=480); background9_cmap = data/images/background9_cmap.png (type=surface, x=0, y=0, width=640, height=480); stone = data/images/stone.png (type=surface, x=0, y=0, width=86, height=91); key = data/images/key.png (type=surface, x=0, y=0, width=49, height=24); inventory = data/images/inventory.png (type=surface, x=0, y=0, width=79, height=68); inventory_h = data/images/inventory_h.png (type=surface, x=0, y=0, width=79, height=68); // EOF // Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 2124 Text-content-md5: fa1f6e008c190bb2c99b37682eeddd67 Content-length: 2124 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method use ((console )) (dialog:add "You press a button but nothing happens") (dialog:add "Maybe you should place a key in the keyhole?") ) ;; (let ((obj (get-obj "door"))) ;; no need for get-obj here ;; (cond ((closed obj) ;; (set! (closed obj) #f) ;; (advent:set-surface (adv:bind obj) "door_obj")) ;; (else ;; (set! (closed obj) #t) ;; (advent:set-surface (adv:bind obj) ""))))) (define-method combine ((obj1 ) (obj2 )) (cond ((closed outdoor4:door) (set! (closed outdoor4:door) #f) (advent:set-surface (adv:bind outdoor4:door) "door_obj")) (else (set! (closed outdoor4:door) #t) (advent:set-surface (adv:bind outdoor4:door) "")))) (adv:define-object outdoor4:back "back") (adv:bind-empty outdoor4:back 0 300 70 340) (define-method walk ((obj )) (c:guy:set-target 0 426 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)))) (adv:define-object outdoor4:door "Door" (closed #f)) (adv:bind-surface outdoor4:door "door_obj" 310 31 0) (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (cond ((not (closed outdoor4:door)) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))))) (define game-scenario:outdoor4-objects (list outdoor4:door outdoor4:console outdoor4:back)) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Revision-number: 34 Prop-content-length: 126 Content-length: 126 K 7 svn:log V 24 Some small code cleanup K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-01-30T21:22:44.000000Z PROPS-END Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 5106 Text-content-md5: 717667016336d6e5a9184f9e3c5173c3 Content-length: 5106 // $Id: Coin.cc,v 1.9 2001/01/30 21:22:44 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin* coin; Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Coin::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &Coin::on_button_release)); marked_obj = 0; current_obj = 0; ignore_press = false; } void Coin::draw () { if (current_obj) current_obj->draw_inventory (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (visible) { //std::cout << "Drawing..." << x_pos << " " << y_pos << std::endl; sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::set_current_obj (AdventObj* obj) { current_obj = obj; } void Coin::on_button_press(CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 0) { if (inventory->is_visible ()) ignore_press = true; } else if (key.id == 1) { std::cout << "Point Color: " << Scenario::current->get_colmap ()->get_pixel (key.x, key.y) << " " << key.x << "x" << key.y << std::endl; } else if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } } } void Coin::on_button_release (CL_InputDevice *device, const CL_Key &key) { //std::cout << "Coin released: " << key.id << std::endl; if (key.id == 0 && current_obj) { if (ignore_press) ignore_press = false; else { AdventObj* marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { GuileAdventObj* obj = dynamic_cast(marked_obj); GuileAdventObj* cobj = dynamic_cast(current_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; current_obj = 0; } else { std::cout << "Use: " << current_obj->get_name () << " with " << obj->get_name () << std::endl; gh_call2 (gh_lookup ("combine"), cobj->get_scm (), obj->get_scm ()); current_obj = 0; } } else { current_obj = 0; } } } else if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - ((int)sur.get_width ()/2) && key.x < x_pos + ((int) sur.get_width ()/2) && key.y > y_pos - ((int) sur.get_height ()/2) && key.y < y_pos + ((int) sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { gh_call1 (gh_lookup ("use"), obj->get_scm ()); } else if (key.x > x_pos && key.y < y_pos) { gh_call1 (gh_lookup ("look"), obj->get_scm ()); } else if (key.x < x_pos && key.y > y_pos) { gh_call1 (gh_lookup("pickup"), obj->get_scm ()); } else if (key.x > x_pos && key.y > y_pos) { gh_call1 (gh_lookup("speak"), obj->get_scm ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } } } /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: change Text-content-length: 5435 Text-content-md5: 41b13cf0ff2d8a29336eac2b74ec11b4 Content-length: 5435 // $Id: Guy.cc,v 1.5 2001/01/30 21:22:44 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "GuileAdventObj.hh" #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy* the_guy; Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; target = pos; delta = 4.0; target_callback = SCM_BOOL_F; on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &Guy::on_button_press)); } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { if (target_callback != SCM_BOOL_F) { gh_call0 (target_callback); target_callback = SCM_BOOL_F; } counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } void Guy::on_button_press(CL_InputDevice *device, const CL_Key &key) { if (key.id == 0) { AdventObj* obj = Scenario::current->get_object (key.x, key.y); GuileAdventObj* guile_obj = dynamic_cast(obj); if (obj && guile_obj) { //std::cout << "Issued walkto event" << std::endl; //std::cout << "Obj: " << obj << " name: " << guile_obj->get_name () << std::endl; if (guile_obj->call ("walk") == SCM_BOOL_F) { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } else { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } void Guy::init_guile () { gh_new_procedure2_0 ("c:guy:set-position", &Guy::scm_set_pos); gh_new_procedure1_0 ("c:guy:set-direction", &Guy::scm_set_direction); gh_new_procedure3_0 ("c:guy:set-target", &Guy::scm_set_target); } SCM Guy::scm_set_pos (SCM arg_x_pos, SCM arg_y_pos) { the_guy->pos.x = SCM_INUM (arg_x_pos); the_guy->pos.y = SCM_INUM (arg_y_pos); the_guy->target = the_guy->pos; return SCM_UNSPECIFIED; } SCM Guy::scm_set_direction (SCM angle) { switch (SCM_INUM (angle)) { case 0: // up the_guy->direction = CL_Vector (0., -5.); break; case 1: // right the_guy->direction = CL_Vector (5., 0.); break; case 2: // down the_guy->direction = CL_Vector (0., 5.); break; case 3: // left the_guy->direction = CL_Vector (-5., 0.); break; } return SCM_UNSPECIFIED; } SCM Guy::scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback) { the_guy->direction = CL_Vector (SCM_INUM(arg_x_pos) - the_guy->pos.x, SCM_INUM (arg_y_pos) - the_guy->pos.y); the_guy->direction.normalize (); the_guy->direction *= 5.0; the_guy->target = CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM (arg_y_pos)); the_guy->target_callback = callback; //printf (" Target Pos: %f %f\n", the_guy->target.x, the_guy->target.y); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3797 Text-content-md5: 6252bf5507be5cea2413135dd41d32eb Content-length: 3797 // $Id: ScenarioSmob.cc,v 1.11 2001/01/30 21:22:44 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); scm_set_smob_mark (tag, ScenarioSmob::mark); scm_set_smob_free (tag, ScenarioSmob::free); scm_set_smob_print (tag, ScenarioSmob::print); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::mark (SCM smob) { //std::cout << ">>ScenarioSmob: Marking...<<" << std::endl; // std::cout << "Marking: " << obj->get_name () << std::endl; return SCM_UNSPECIFIED; } scm_sizet ScenarioSmob::free (SCM smob) { std::cout << ">>ScenarioSmob: Freeing...<<" << std::endl; return 0; } int ScenarioSmob::print (SCM image_smob, SCM port, scm_print_state *pstate) { std::cout << ">>ScenarioSmob: Printing...<<" << std::endl; return 1; } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } assert(SCM_STRINGP (background_surface)); assert(SCM_STRINGP (colmap_surface)); obj->scenario = new Scenario (scenario_name, SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; std::cout << "Scenario Pointer: " << obj->scenario << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); //std::cout << "+++ Scenario Pointer: " << p->scenario // << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/data/images/retriever_coin.png Node-kind: file Node-action: change Text-content-length: 11239 Text-content-md5: 128d4101fada7ec23d60dc599621389e Content-length: 11239 PNG  IHDRzzpYGgAMA abKGD pHYs  #utIME ~ IDATx}Yo#S\,E %jԫZv'@\"W3໚437?"@ 6m7K-NZȚ =<,%uK$zBzλ/\%]%]%]%]%]%]%]%]%]%]%]%]%]%]%]< {Gd]?ʺ%.zTPߘ\q [_WwI /A Aw= wwA 9Z @$AE\.8j^||ciVUUt:e*`p$yqοv* 'LӼdcؽш,p:||ĵ$I0 $I`u]ip8|$ H}@v:$>>t:Nt: ͸vt,Z+qܽ{d2tppelX]p :zFOoP6Ms;οx<}@|>&}>QJ.InNLL`ll x`$A$Ȳ T*T*hǎ  i4Mc]2x@A;8qip:4D4Ax{T "I"<NRTT*L&=1NFD/CD"ԭ[f'&&!23PH VUbeeV&&&pMA8N(> <>Y$ 8a@u\.x<t:nAM6,˸y&"L*-t/<$ sss'|}zU|WPDpc"4"MJu\LCb"juE5,@iGƍ_&666p<`bnc>hf'F;|C.Bϟ?@ddx^ozĩ>6MC`$YNPU{vy p( GG0M3~~n X9ږ/ yɲ$ %=ǯqh."<}jhZX,T*! "vT*\.C4A80nflz@ ׅW_ tzŵkנ*4M3cjډ'!1I*3tcy0iSY q:qPUD3ztPVt( * m~Q xKƒd8Fz *DA\v x:UU<3-ӏ|<߫*&*7M4 \.D"$ 4 j4(ˈFF0 >XV9=q=G)zF`=nk}_>h׋ai f XN?b\,#0[a&]UUub"r*~ل(eME`*J/8w^)loo3QHn y۠ɛEu]GVch$I_u\H&C4.vwwi" ( iZ_8n.j./j&[/ @P>G( ^| o^}> `1u4},Bډ<m+'纪=:uG1 sp:.B*U4MvgRTUEӁ^ Yt+͐`P.m J޼y?Pבf#Xr4q(8r]y袻~W\,JJ2V,/似n6}v\ h0vH$022wB4xkkkCPUB;;;j "cIXgϞA$|>A$ $ 4M^Ƀ??37CTE>Yh72̅c$2]"r!H`jj z*$I¨|.,fχ6(ܹӉbB\óΚހf'#t\֗%y0h?L&8BQJǴ#155Ō:EQXf͒lgtف{"SZm~A!IE&RJ sZ]$r8EanhFlReP>X)ʔ$'=3g`0ׯ^hcl{{{gJlI| b}7nڵked^8<bRngd(R4MC2DB>?~M&Q$p% l6fxXIpRA\(H&8O+{h4#"lAN<$籴B$:3"v( 6EAP`RHj }X,j"aLLL`vvlmdS iBxHMRw^ǎD"b ƗZZ-er> z(ဪLF!7 ŃKF EDQd(D@/5i1.LT[i(@뺎jBŲ=DT |t:n~׊ kQQD\fhJ8Pw0D0dFi ? 0 4MZ-vyW44TA8`%vAvEl6)"FIWp8XȔbT>L'fxTNTߪkSe2 $j/\H6ÇT(b1n|Dl+@WOjRV)·T@2h(PT<}2dX#vzf$CT T.r#˲{||\t:`#Êu SRʑb|wKxBeXM^gm0dVHQ'p%T qUٳgj@@0 CU'RF>8_IӴTe^%@!a{:ɰJ[|f%A|MZ6+J ]putM-]J%^%ۍ`0|fZk]q*{"D O: Z>k01M]CG$$²,,+i4}V9:}\E2%IrիWn=Zu<:NPUխRx@!#* +886q4XI7$Qt4.´yt8{{{}@%pMD:|g>>u\rڑUC`=V&"VV DJR"m@/ |C=;;;r^sy=kΔF+&e.U1-oʏk?^@ ֞%kk Վa4" Z4t7h]t=*+~߄9pMNNI]Q=J(hJ4<yq?Naz S; |ccc1/Uvhk֩lֳr.M8Hd[ga9[h'}o2Jk!_ZAn/^ i҆s=Е d xD&oF(MDZq,Oa6܆.  #WǙfBh4j4@Iދ(dYIpOOOnc"t]g>C>>? \%˲Mq0v&z_C_QP^~͌p8QQ%=$Ν;D"xPpkxAYC󡩩)G*B4}*Q1?8ݙ@&2v>Fn02, X^^ϙL&zBO@Sa8F4owwW* .tEnkjRԔ?v3-r$T@HF%Yڔy,rNѭV B|kkkf}9j*v:buh|qun7\wFGG񱱱X<'&&ܩT@"oC8<籽e֫H$(H$@0d2jc>IMu h}FU2aۍd2ɬ[^.XE搈&Sŵ֘>)#ʑZƤNsssB:FXYU |]$x.Њb _VQ*P(^/"MƖivG7/,,UʲfW^ *S%1==gF (bh4&p8$H8x1ˆu:|wo~7ۛt A=V\ 4eX,L#Nr!#!@UUdپޭ[033þC=&''q~lnnbssM /h4z)>s~lmm߅6_@㏱EZp R_wM)IMt'伟nJ0h4PTЍFYQs$IBB&a>q(<+kkk TUeHvwwsV 2FFFwAGT&$2"P,:+T*H888ݻwo_.Y($>mCg|#q>YD~DNqpp*2yJ4TUP|- D"oҞɬY1~*m ennŸ'zRGE,,,x~?ۭV x%ij2  7Y*+O^h x1jEARat;dp8%ÇDVãG_CQ$Id2ܿH駟PvׯT*A\r{{{ Tza;n=Is4Fx:zQ,--!f\Y@Wb1jK t#T*O?Z W\9V+*G89o?. =B($M@6$IH&8<B0a8<M&fOQ XIDATb)/6 v*壿{o kxQ#ktt\.CQvמ$ |l G}L&W2O6Q*M$ wcSIOS!-90D";X,X,boo_F\iV~oV_X~N|Η"``0n0==ǏcssR _022f7oa4 6j5@ 8zlzѰihݔP###؀+bee[[[( 0 ~.'5Q?OU(Nh^7n@6ex׮]c҄S: p80W}æstVc:yP*7Ұ6j=ot-"+G[7ߠG/_pt^zFx("2*]xK>#ɠ\.>󝩈,6̅hdۍH$b{;${A)@Du=߷L!2$:>9*PI7Gc&VWWD"> L\S-:4V2`cc*IHlPvJ {E@ޥ Ǐi&H>UWEVH$q5m ~߳7il66 U |駘c-CvUiu]eæ i4(}I 򗩆.4ܳ|p8RIdѓiFGG199@ ~vW^A2dGJ&( X,;m ܕ< hEQfYQeVMBȵb0C`Fz+++x,ðǙCXVYoexqz=;w0wԸ׵o=KÎ޺xi(d28dYF4eFa; p8|fl6k~,*OHiVsp8%@Bz ζH$0::rD2 _FDx1]ăTUu2N/h37raii&p:Xz$rKCZe(sm)JҿNUaӉ t PXe֨{֠( ϟ|zOԒs*]$&t:Ec,."rߘAq~2_UɻPݤq6_x`lIRh:0ȅzp8+Ǚ^ˆ&_"ͶJRv??LJE0t:L  nj">r7"] Nid[&XGS/q0$Oz\h4nwȯ6'~ɞ6bR(X__zl4.M6x7QW01Tr4T T(؜k$"7I'xQˏ&"hv1g-|W-|~Ƣ|jUulllӧXYYiollt];‚Ķ{柿:# t6*XTfv4 TyArc ,}fɀ%T˗Ro~#n5R|WG*(LDZ?~/sCYFmt a=p.$:iv {UUbq|kk+nJSpJp"'n!(cH c쨦iweeS,v^qr<l7Cީvٳgj&i:z74Ny}fhc̪_TtUUKL~\NK klǏ 1k `@j5hS0jX$Ӯ~J~>_n(Nq8#ëvtmxZGw֊=x팴tѢ@6x h4F*Sx1?~qam5B* i; ќP(ԗh!ËbG~(&``[?C|1{(zн-ܐ=kyst҄uĢBz8XPMhn5y}CCNV a]UUiFIds[՛G幊q͟0t4Rz@8~sW[mǯܮ,^'h~ %yngԗ]4 _zk\o{Ut<4k Emn%.u5ia:zwA( Yv v&MlAm}tѢG'h֋o ޥ;P7y.0"o'kz%VutǁA~.#ۼ[92gh1UG hkhvƘ5hc4 hd{7,@[u4ռA&?.2f}tѢ@!ۺӸ*y~^1v^~&Lbzc4, xJ@}hͯa:>ۭ']uE6ѰҔ@;NtkAFy~=8"&vҌvn˻Rm~ŸQ ^~[kv.*Pbw~AIs9zrrh>2,k;.Xo>.r񧝃k 8.E.;8Ĺ9=cJh () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (adv:bind-surface obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:bind-empty obj x-pos y-pos width height) (set! (adv:bind obj) (advent:makeobj-empty obj x-pos y-pos width height))) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) ;;(define (advent:open args) ;; (cond ((equal? (length args) 1) ;; (gopen (get-obj (car args)))) ;; (else ;; (dialog:add "Don't know what you mean.")) ;; )) ;;(define-method gopen ((obj )) ;; (dialog:add "Don't know what you mean.")) (define-method combine ((obj1 ) (obj2 )) (dialog:add "Don't know of to combine this two objects")) ;;(define-method gopen ((obj )) ;; (dialog:add "I can't open this ")); (name obj))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/objects.scm Node-kind: file Node-action: change Text-content-length: 1410 Text-content-md5: 4766c0404058677dd0f3941399a3e5b9 Content-length: 1410 (println "Loading objects.scm...") #! obsolete (define-method look ((obj )) (println "Don't know what you mean")) (define-method pickup ((obj )) (println "Don't know what you mean")) !# ;; Currently not implemented (define-method use ((obj1 ) (obj2 )) (println "Don't know how to combine " (name obj1) " and " (name obj2) ".")) (define-method use ((obj )) (println "Don't know what I should do with " (name obj))) (define-method look ((obj )) (dialog:add (string-append "You see a " (name obj) ", nothing special."))) (define-method speak ((obj )) (dialog:add "Nobody to speak to.")) (define-method pickup ((obj )) (dialog:add "Don't know how to pick that up.")) (define-method walk ((obj )) ;; (println "I am a BUG 129233") #f) (define (adv:load file) (println "Loading file: " file) (load file)) ;;(gc-set-debug-check-freelist! #t) (adv:load "scenario1.scm") (adv:load "scenario2.scm") (adv:load "scenario3.scm") (adv:load "scenario4.scm") (adv:load "scenario5.scm") (adv:load "scenario6.scm") (adv:load "scenario7.scm") (adv:load "scenario8.scm") (adv:load "scenario9.scm") ;;;;;;;;; ;; END ;; ;;;;;;;;; (println "Scenario: " game-scenario:gateway) (adv:set-scenario game-scenario:gateway) ;;(adv:set-scenario game-scenario:outdoor7) ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3522 Text-content-md5: f23bfba0cce31737357b795eaa74d19f Content-length: 3522 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (adv:bind-surface scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (adv:bind-empty scenario1:gateway 405 105 130 225) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (adv:bind-surface scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario ;;(define game-scenario:gateway-objects ;; (list scenario1:chest ;; scenario1:door ;; scenario1:gateway)) (adv:define-scenario game-scenario:gateway "background" "background_cmap" (list scenario1:chest scenario1:gateway scenario1:door)) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario2.scm Node-kind: file Node-action: change Text-content-length: 2012 Text-content-md5: 9afca2ba6868b03f0a44d424a2de2ee8 Content-length: 2012 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; First outdoor scene, in front of the house ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object scenario2:path "Path") (define-method walk ((obj )) (c:guy:set-target 22 424 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 614 439) (c:guy:set-direction 3)))) (adv:bind-empty scenario2:path 0 260 70 220) ;; Objects ;; Plant (adv:define-object scenario2:plant "Plant") (adv:bind-surface scenario2:plant "plant2" 208 350 194) (define-method walk ((obj )) (c:guy:set-target 180 420 (lambda () (c:guy:set-direction 1)))) ;; Door (adv:define-object scenario2:door "Door" (foobar #f)) (adv:bind-surface scenario2:door "s2_door_opened" 236 247 0) (define-method walk ((obj )) (c:guy:set-target 302 336 (lambda () (cond ((not (closed scenario1:door)) (adv:set-scenario game-scenario:gateway) (c:guy:set-position 241 278) (c:guy:set-direction 2)) (else (dialog:add "Door is closed.")))))) (define-method look ((obj )) (cond ((closed scenario1:door) (dialog:add "The door is close.")) (else (dialog:add "The door is open.")))) (define-method use ((obj )) (cond ((closed scenario1:door) (advent:set-surface (adv:bind obj) "s2_door_opened") (set! (closed scenario1:door) #f)) (else (advent:set-surface (adv:bind obj) "s2_door_closed") (set! (closed scenario1:door) #t)) )) (define game-scenario:outdoor-objects (list scenario2:door scenario2:plant scenario2:path)) (define game-scenario:outdoor-bind (c:scenario:make-bind "game-scenario:outdoor" "background2" "background2_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor-objects))) (define game-scenario:outdoor (make #:adv:bind game-scenario:outdoor-bind #:adv:objs game-scenario:outdoor-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 2269 Text-content-md5: 4f4151694afaebe21b1fe45278d1ee10 Content-length: 2269 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method look ((console )) (dialog:add "The console has a large keyhole like hole, maybe you can find a key for it?")) (define-method use ((console )) (dialog:add "You press a button but nothing happens") (dialog:add "Maybe you should place a key in the keyhole?") ) ;; (let ((obj (get-obj "door"))) ;; no need for get-obj here ;; (cond ((closed obj) ;; (set! (closed obj) #f) ;; (advent:set-surface (adv:bind obj) "door_obj")) ;; (else ;; (set! (closed obj) #t) ;; (advent:set-surface (adv:bind obj) ""))))) (define-method combine ((obj1 ) (obj2 )) (cond ((closed outdoor4:door) (set! (closed outdoor4:door) #f) (advent:set-surface (adv:bind outdoor4:door) "door_obj")) (else (set! (closed outdoor4:door) #t) (advent:set-surface (adv:bind outdoor4:door) "")))) (adv:define-object outdoor4:back "back") (adv:bind-empty outdoor4:back 0 300 70 340) (define-method walk ((obj )) (c:guy:set-target 0 426 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)))) (adv:define-object outdoor4:door "Door" (closed #f)) (adv:bind-surface outdoor4:door "door_obj" 310 31 0) (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (cond ((not (closed outdoor4:door)) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))))) (define game-scenario:outdoor4-objects (list outdoor4:door outdoor4:console outdoor4:back)) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Revision-number: 35 Prop-content-length: 154 Content-length: 154 K 7 svn:log V 52 Some more object interactions and a smoke animation K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-02-03T12:42:16.000000Z PROPS-END Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 4389 Text-content-md5: bfb3d97a44dedae2ff956caa7ccff0ed Content-length: 4389 // $Id: GuileAdventObj.cc,v 1.11 2001/02/03 12:42:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; } SCM GuileAdventObj::call (std::string func) { if (SCM_BOOL_F == scm_object) { puts ("don't have scm object for call"); return SCM_BOOL_F; } else { char* str = strdup (func.c_str ()); SCM ret_val = gh_call1 (gh_lookup (str), scm_object); free (str); return ret_val; } } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) { if (sur.get_num_frames () == 1) sur.put_screen (pos.x, pos.y); else { if (counter >= (sur.get_num_frames ()*10)) counter = 0; sur.put_screen (pos.x, pos.y, counter++/10); } } } void GuileAdventObj::draw_inventory (int x, int y) { //std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2217 Text-content-md5: c948786f571eb0f171882a24532a416c Content-length: 2217 // $Id: GuileAdventObj.hh,v 1.8 2001/02/03 12:42:16 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Surface inventory_sur; CL_Vector pos; int width; int height; int counter; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y); virtual void call (std::string func, std::string id); SCM call (std::string func); SCM get_scm () { return scm_object; } virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); virtual void set_inventory_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/data/images/background.jpg Node-kind: file Node-action: change Text-content-length: 52454 Text-content-md5: 0e56bf9c63594f8c95c8aef9a9e3f092 Content-length: 52454 JFIFGGCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"K!1AQ"2aqB#3Rbr$CST4D%U5s&6E ?ezOR[y~"==h&nf=)+1Z:dqVh}Q@W Ie%S4fvqNXܪ __1@qQt:S7Qy -O+ih|RP[(]8$yT&2gq\OaqeoFٹ^^cq=[} ȭt%X.= e%WugdYHH S3ߤpEn-:æ#ê6H)ү{&Sp6Cւ42(4,tgZ5vUqA շҐvn4JGc݈=5Y_0p|woJh6^RHFHT"V7V0-kڐ4ţ7ң{GC*gmh]jq7@<)Nvȶ~u"gqi4,k152[>$ҟwܕ[9>FMbD5S#9յHC82\BGnŜ(.B;`d~7XcOEn5d KJ\ 3Zm΁c:Q@SlfMeͪx"tR0G s.K1Ǽ?8+nb1#lFJE{xRH`yuP.zg:5ײZGQc2d?~4qV8hgsyHhJF,E$j~ij7-FCM .՗١Q]ƧyrQ1%n2ŐfQ?zGv'5lDh7 duD١iӄ;:;RfcYB.=AN3nu 1:۬gyV](] ِԙY(<3/?2塕 7@jN iX1)]O^-l ;S^,rL>4 ?=[T麼tQ45$>D,bC@ougG '̚_~+.IdnX>6Vw2RP8`O~o/:orJB @~wDGm5p!Ys.aj+/or4~.w+ AsWσ*ষQ#Dm[_* )SԏU푛ns9_G{RiPkT'%H:䍍f^³n&Ӟփ7M[X[Y)$}(abO" =@=(-iEtm՞PMbad@Z/cPh4oU4-s y{RvOشi] On/:rLͽ?mWM( *kY/(XtWMacwI) Lڮq3]φkB8`IcʈX-#MI1@2N,H?҉yE2S@$,uAWc)q7L" r0GU@ۯhWÌƇ\(܃/-#/ DQҁds8 @s,>`,ԷWI4̇`aXdc[ xxn`k©bBT3 ,oMS5sb(4jx}B]@۷wdSm˒53$Y: PH Pfb[xɷ\#o$2@\=B;WǽcHθK7-43ڈoFBFFQa ?bGphq\kEb:ֺ NiYBYʺ gO<} H5'g1p>T|?ƻX.R9&g3,y.t@mt9emxd *;%,IpK%4kaΚB6+9ddR#m)9iyrrp&L5sZL~$$H7_rS;֬aj3"M5Wfh$ٯ-AwѸzq],xj6O5j?vv'q]5: !%IpَVV&TEn[ h+I_)שЦ(6BGj>\[|Ԧ,sL1$(@_0;h4n~dueY9q rM "1ڀ%gՓgxOګ;5a8 8ᵉC7A H1t9=޿C=dWb˲8#Q^G(џl`:$#yJ@ ;Wy,l|ƾlBE۞RjЅNsUf{hH/M{k3LV(+c7yYG(%Gs[n"D҄ݷVlI,T=ط˅*zLkF# mg8> <ϯJYond])0@׼DW@YxK KnBc{c!&UTanZ-Ϳ\N@>AL52ݑ#yjݒeT]J0 G^&Sl! !\칛ӑ:U5΢BOb|G$l 5<5FAE--EH}*FEw5H-#Hd.tTW2.*;{Vљ.^yՉ{ۥq_2 MծNF,Iqrr򤌕c ,#gX7Z%Ҧ%om{n ;jF#!c#5k$mh@d|Z01Ц xcLKJ;Er@@Ų ;To’ΣRkdԼ@üi֮OkTĤ~41A lZ%xdBΟuf,ю!Njow>l@gy_PڦK[lJqb?ݎ7Q@wa|G,rCnt(̆[A7YbͽKsz֡@t;bV/.{n 1yD/h9yg8sߖERdC P_xBe:1` V=GQ\)ꂷ$7* R I^Z\,LF+┛nu"= HJI5ո7Qo<Џ4..y쪃֫~hz:+2As'I"]v0xYLiƼ80=TOKՅT 3_F'՛~TSǏKb,(}RLK+BA!"ӧsA<{_#A͕JOm<1b*RmeQV\>nssH4~=)d:V1]oҙ0hU+E&9%CLN6Ra(H|8Fifٚ[4'1!mb-ڪ=hmq * RYDc~BǿjSBamslO39Qeqں!;:oKQG론yˊ.|ۃ#£_י@ܶr zPk|mлˠ ֞+E0y8mtlȑۥuJPIoo9hzD"AjzI;\71UṶᮇZǏBH6sC+CY?q ˑCҨfx/s!Y$%W:QW.&W.YTX0jקV`&&Xݽ= z&ĺnH2U\|&޷DwJ+7hP}h"J\21}(%ܡB/F4 J=I<\v Z GJ2aXZY5rI'~?֕ʱ_$Xǘh%E4kό28Wbݣ(ʎK8Fcm-%wz,@m)0D(K@&"*I*`vPɕ]RZ'8aL63.C/]n0P;η1}>; TonTґi9FZk5gAӸ~C:}pZ\lWљЪG_m('b5bù5>$m*#8}@PHgD2 gg+҃Ow!V⹁qY yPB:*ulԑё@1v1t~nvk%ZNyOp#8fkb*!0k#N4;-]^b*t;[t+z4YTSc-=Vqպ :Elƻk ?.ˡ xff;9PwXD(18ƏgoxK2~#urkz=wE?FLQW`~qTx[||Xۢ?Zfnqfiߥ5FV>+9:ln:i|0K{tĈ"tF]%(<-75ó~ Q:&TY$J9opLz-'0 C@k)P@MUT/}y#FaPV $zLVO^^fz b@vXPtxM7&Qw, Ʋv:j;<fW0ONRĸG;cnUt(ZϙcSҘ,`" SV'] i!S^Ə͒;cs +)A i߭4i@V|V2 K{HSA4@o 6t6h+b @jU+q.:W o"|šmש$! g\EVT)MpDROPUb#oƃE>)nRyMcl_#$_=e%/1թؠd\\!4"4(a*$N{i$4@CH2M|֨֘ [HA}i@B8hA@?=G{0 =?Z$SXjI8Cx [geW@6z֡{Yo (J̪vRqVM,+ # X`av . rhq>1CxC6l|6t;ʈ򴋱i xrIUZ} 5rO0s 75qO4ĆR4dН`Ғ[ޙ$[\\d>Ub>cv֓\5QbF;`[AwlȔwv8j)[ x㧼G֟l8&e&%@ ,: p'>^J8|%tܝ* G9{yn5)YdE/y*.!H2[Ag㈸/xw/:ZѿCFU\vʂqd Ki@ytME'. #r~k,QW5fzP2O =VqL)//aC O]DŁ J7cM r GY6`-7_1a3V}[.eidU36't|6hslW';l†Ճ6P6FZ7jE0VɿQb4|ܼ-qw'_*l T2\Gzmm ڒMWa;4c՜vP^d#1L5ͥѠa%*iTeV::;%"boxTgwDq|Ísȶ>ꍓKy'UӨlunT:1te#Efz#q->S4Jwَ#GШm ¢]>{kk۠oMy,4cE7P+hJ񯟤-4я O)X6778#`tK-u 'х\msc:'}h+qB\0+2YsSzf4nvOr6}r98|^U~)$sؑNȐuWc\jR>7pNJ<(7E6Vy߾RqӒ6S/eQԚy*fx)ĹCmF`u=hDqx.oU06`cT_/: #ۮ&@@:V˅0pd-զd-hhNυ3Hy& ~ ?ګqnYϻm]zN8"O eU:!w5aH܊ǨM##W@vLi;J˯ 15.E1~t^T"wh $@)KA˒E|[K(ƼaWo1 ZJ_@wrqDS@?*yycioz- 'C@?Iz( {`G=|s l{YPJ"OtrR⣙Y!۳yS8BIi":~(,hٜQ{\rv7CAox VP7F:ShWv|"?so[IR:Ѳ/{/(?ZcHTTU]CK!>Ưp#3_|9ec&NsrLQ ] +TÎ˵̃~o?΃Jȣ~k~OTs $ڗxϋ[`+{<|1rOJTpn"[G!Ź;ryt$ަK ^LI,zWZ:{xqr6@@9AIb9U09#AuKivuȤaˍ򍏕A"G#+^Uh8n5*ltVzxbr$60`F?d;Aw}v:#m[].&a}z;"&I:}yccXP zR=Yx3`#v-Pf[eC0a$y~^ui*h}J\6%+yd%Hpu@'BdMe4_Z#٠M)b:~SCq)yښC}Ěh"^*b1f8@Sjlc:adP|)Xѫvb1 67`#\}^s ?C>qru&1F"-:DOm:/O2jZ?5L~o[̂9cF-0sAu8;-R~ymUG <ǐ.B&ؼC|*fW-U|>j 5$B{I Gk@pr7 Q:xhg[׳1-*h1^Inc\b?XŐxJȬvErҠ=(~lNj|UHua#ޏ>adN_5:?U02SO/ [Hyߢ 4w- XzI-2y M짪*Ҟ[Ch7C'S6 Gv#M]l&22oC>y_=r4pW$}+qDɫGǶ<7'o3k%3ŷno&PIkx܈ߟFKa15+]گ|G w7<.{?aX=Yr K2lPucTE5Vb}(EZe.(8x"ex}>1\c&$#vb ?N @|B{3{kXx09|%yz{{P+dVG,USMc@hr\)bY5 !;>tÃ6G/Y-\;,R^܂5C%G 'CtJ:k H~#HQM05@ f 7V0p}aHOziD(E)ȏa%]Io٠aqtwy~G!s19ն.|2]w8hÃ_ho9@9v؃F{e}uתѐ[{綼ùm 1_a A:É,B9IPu0Z]XM%hX<C4oKIؙoQH:sҞ,о>HuԚ E`{ /.Xuݓt;|TJ 2hIoZ8{'LX;E6:Z-fb|ҏ+64!};BN,paauǵ,~-뗔:b1-QeqZd-̍Bfr4T t p%ڨ-Q:cLxCݴP1+1k~ٯ'P5 y ldqG@Vdv2[3JnblAw1ҙ_ޚT+OhH$LnE{ F}G\J/#-̩Aӹ9u&J2i2}=h`3KhmӬVuoSk\moUZnU|kmZiRq(;S`_,]-gUNr/JW{C|*G֪do Mkɹ:ΎE guޑ{ R)֑_|i:Y$dڍuA-2Sh]H?{juĺ'r`Il"VEųw7l 8ih%XbF1f啶d-Fe"C?Ó^9UP8O*C \]ȑƾ,ux2k!~aZ *el,ۧ@>R;)#4oBcEiC&>yH8^'_۬VQ=IAy%^~h8Nly'r4=k[cmc;ðX`Ν1،Nz A;dfA=2q=/wJWHѪ3RNy; J)=;~1Eqb~m|<9& !z::{(bO(3|V9̦._\vq hFE9~ )ݕ1:u4 Uhٌ1T HԊNJҋ`&G;1B;о9a\͢>g~Ѡo h0XtVJ=+Hܱ]0 7'ʥ'Kv[V>܄!횀Qӭ0ZknU%3sN6a&X-/©1Qbp>U ܵ*=h.#HV1mwwۻ49'6G'ies۶7re?#ҜxoE"M ýnc ұ Je#==>Bh! ߕ/qv#71X(:^Ho: ҜS9Tl"[imh_J=CGtcؼ6ah'%P7@:Mn2>GnmQkW!TuQӭKXfཕ/;ǧD,0I1YcɿJg92;Ҿ[cQz|M [..(Z  ](XW;4$#Maxf@S^ᦴn(hP<}czGCOC1&.{Wy$+1 1O)mj ?8ԍ͵dx7X.TA׫=?ktb~l^C़1A׫"fvՕa>?4v (CA1ғY-_q4$+ d\&m!E El_-QZ[D =_}׼gi|Riy0yg\64p)=Xb=8 5AKUP/Js丆;s+76<8(m6BhX2U) j~aLQ@\[򗕧oA{ 8-E#$پ&EV4?^M2Xw/K1Vj{00^Ӡ_8NPO37fwy$uQ8vU~7ߺOS^M6|Va2AAİY/+;77HB: Hrsc¢+pdq~O35o/gRH{ v7cRpj)531w(Y -JKuLm('oQl\K8;  חr=P袌xRL\wAN;~1rLX>#N0c衵í^X/6;hT|KUd8{s4HВ)_ՏD'F e;\ؔuXJv 摀R LFPѤ-yWnP|7SEDm]k22;KGn3yJ "fkl(*mGZͦ씉\"Jێ1ƺ9n"#-Pj!]v_IJ=ͭݲsʪ[DA x}#Rvi O2hFo.߽fսݵ9-Og4n |V9»No/JHXvuҹ ܯʵ쐢2H'8eeq3Ŝb!$ A9k_kl~&-%#lP lBV^~T֪n.%ܤdjCnerũ[!X ׇ"NLn{\clcE*h OƂw2ś쎝*;7r!|8#mhK *l|)c>|DX<_l݇0`'QF %u1W#de=vx%Pp'pÆw*tҾY)l"V}4ǏȶGƧoȶo*c֙NShLA_Nsۚ{{_cr0L{* 8zȐP9E+~q*cXtHv|' oǩ#Κpn|0ރ@78pV0Dbq({\|V q^ E̖Ȋdѕ *6E.线=6PtO_~A6a`~iWOs@ -`xd 6%Uc¹ׁ}yoxdaRQTOot=1cƞ5 O: "AҰ u5 W-bkIF0}hաcCd|TEMo/1c(^-@Ι1mǤ)ސsgy {H#;A뻦wGU_+:!=|s^xq{Z%]^SK޽z{dPd~||Scq ۱;he[+NjV>vk߽8S4$-Fq!zhݥRwc#o|o'QA/BǗk |D*y\>ha[ w:GNb,'\x]x]ө\c0'fpmgE꽷MV2xx.4F`ôv7+94Jg54dFܲ@lA> ;6Bd&@H4|f I3$Mk2`yaS%>8Ko72Ka@,^i=81SEwU$kgT9q|A -(v$uiO6lLB0ӪV5AZ-<ÁR6XBR7ָ(OČܧgΦ])Cy:1n"vG,|>CֵV]f83@? :6gq²Pq N{訿4Kc{[H:_r RE ;mhۭuQC\4GD /q=mS]/u[UiBKTu3WŒD]וN ˊ1*XGE5IA4"SQ.bF*$]v -h;ySES`E\x 3_J ]啡Brεl36?B4Pa.$[Cqo`;`gʊUm{PiB.:tC| Y42evYrfI@O4K5.U˟K@Κ4I) wOgU8/qoJcc1nDsmbڗ87c`u;VC.8[(튿'z[A[l: Ë\KػsII>`Q|i?R?/C;>1 n* koP~u8vENa79Kv>A!{u|KhQ ZyXgiBƖJkru赓^x j9\hޘҠ1Xթ?h:hװ-Vks-"Ƭ:vKXr]Ơ*Dzuߥ9eOX(V6a\>!doGpLV6Np: ֈ̐אxuX_(宑LoP{y_GԨV=ʾ9 DSNYΐf}jdSDۭ]Nv }.AMV}G$z%6esRڎۄBl$]>#/#?XL1Bu\oe}W9  ?zB5h3Y[|",8]ׯ"Xm/zX"a=HsASo @u }hp dI:qBM(=/(CO\?"nňNЇFGUwWeTUO"2oV]P 'y+KrrȽ(5el>(kKJ/P:%yi*Ldy67F#s]<1D Pti*I*33ij$,QsP7Fد-H5Ȥi~',Zx9Ά5bVP~FǍr(rtAJAu,֋Gx( 2iCTfB!Tߊ[ky?P\q\Hh-ܵd#h}~Uqy-,R?S;:®[n4M Q2y㌤N׾ 3G[ߏ`=9b!N޴?=+zꁆ;A4gCooO*-ݹI NYm!f>keb\ Ѫ6W}t^ȆNr$VV\;*j!s#iF!शm<.}x^]9 v)m=oVdY"DS?#F4g>z [,/V~V>UF]V߆eyO~naVr8&qףP GhұR|]ozFI 5O\H&1g^!H$S]8ZhR|e)4* -x3e*K@uI+ù$ߑů>35&A8G)E J*©8O$i*W#/)mlqR=ЧJ@Ӆ?xW4(29#|ބ>g'vAՁp޺FҾ8_Ih E>T[/^b͡M1yVAs/1-P嵔6sw=9DxFw'zE|7ka5u`ǔzfLDNDS% @A6=:23" rvǥEI'uh{ w5/i#~kR9;ɢXܮ(3fv顃u=jեk=sXCOOTޤp龔#'rpS ^X9J2((Ggok|FPG&Gvs'hkybn=ݠh/+{Wy(As#i@5f!nA$dС](3׷,=-t21H2ɯ=Vok'[=M\\^ĺVUaFiyMKsh8bGJ : n#7uփ2ʽ|i'--];Xcxz8ޑoÿR b j7r:,_npzبU:<0h7]>t1uHD~f5c)r94RV ޤXK6 t6'íHGa-IZGu @T>Б>\^\ʀQ|n&{q!KzP(wMĞN."wK2=O'gXRHƒ\A6LȬNڜX<וEc}f[yc0Q!=*}ùqoufOd2Rg_3S&:i rdP~>/2~Mr]y"襅R7O hzU$\|MCǗVm&׾Dy+mD\\ÇG10.9Dxp.nu < k\Nl77B*kN)<0P'҄v[}a^%#ͅ1Pj=yud\bޥL>ZFGEX7 ٠gO; QyhG>%asoi!K1i)DZ,([sn܋߯zq73d\l ixVŘrpc(7܊'XLg0wn^9"ocSG/MX5XSżIwBC\j4cim$6 GgPp<0NZqq4=*,L6Xo(Gy|M̳+MXE]ž`EʁHJtYʢ]xޣwnE%zҖ wD2גQHuoͬ5-3Ҫ٫6:kZʁfk>$k4DIRs>a^#~}A҃֫hW/-v{PCͩүs.::jaiGRt zȣaA[ WmZ^]6{1sM&wxL]ļJ΃0[q2I )ˮG*6e)t*nx dդ c$4TOk{<6rsJZ~g>Xd=Q t(kC!Uy;5K'LsX$xNAtUxpP0q9 CBFO2QM0Tg%Y-8AHU4_[w3O@}s#GjGfQDoÕ]}лQEP+gFKe{ rT]6FmV%F<S! ;xA>֬u n17$MxYeF̄\vNinIށ-Gj%)S#@7zFA<@U'7/;DrkbG*N87 #+[OURdW2s)I펅rͰ;S-IL!P(-eqsuW- CdZL_iqD/fJo(*TzPhenU;Y9XVu{+6 j|_z,kd o:%)l̇ua)o^^EZPO6͇Xk),,SAEq(|ŴHG;F* +aa,̊D\4C]h#= 9T^̰žm];RIRܺ>t=ȇ,Agfj۞Pw:2޽:F5`bImMstx"[K3@ųkvV؆Nԗ{K^տpaA `6_&&шVx0 ?AS?JVu+_,H9b1h'">/_벊1A1;E_~2*u_}zWPpΑn|74_.OR~γ/Xqz"F#Tt>+V44B* 3Iwʱ~Mq'kJYĮ{|-L!KUzRdxr9P=8̄잧)dx n =Ա~nv/W;{e9Hk@돑$0R7[dҀG2ۯB e O'Rh3/Wn1&ևDK#qKp#8.nPu@*]~5S˜h/yHgUz@A{L1yY8Bͭ}*i8U]+(J q3Uw VQéQP!XYeVuljr n_x\Z$d}Em#M(L2P5;;>v/X|:@݄`d)(ʋ*^d zkG4dDѼ{geW,[/c׵8ל?* |Jte.5#_2uGb1e/qK* 3Wh̜Qu4sdi:&0;?-kM4[\G9P{{<^$S."٧W^ \Z7M&㤷&;QK`4>:.1c2t Jԑ˿:)"[RP Z (nrXJkiZ^h_y5[%dx&Zf n&wfZ wUTe qMO+@:#$H;k@9F5 #htCqidml r(:*y(-1*(cש

(dXYqNJmN곘eHَ޽h[JH Р\^x")$4v,!@壀L` ?+h~iy}|V =?4L|a䌙=2ʩw T{U5lG)J3֩&k,<4aMCK"|NYx)J a wSJHH=OViXB0!XHҀ>v,Low)6TPS3'C FR:Ǯw1V[FE/%dR{k$gvuuopFv5̠v{r [v\h-}: DO4}@5<)rAQMUA׭wc't)wј/c>AʃhI K5L-\=ˍh%v=yT.n:nZgĽ);ҋclӽ-\Fy bc;٫퐹q Ur5v--Et4A7~{#پ! (kj3 t*9i_wnBͩ#.IGJ ;A+tGҐ~`,Еc$oP$nr<=x [d7=.>$X2lRFXHov;Aܮkqv6џWfv 3aB#*.Ͷd5"^z >t+77Lj46}k(<>:Cѫ{W2 zyϺfl$ f;~nV ξbvD2TpgW$Řf{P-텷=OS4FAH?PTTɉJuN /mP!/eJ*r7+?J3lW"6tuB 6Chejyt9OX3[Et+RlǦabfב>dI`"(~FGvd=*;hU;5No~FU^%=w̵ݻ7|eA7>T>(}xhւi/-ܶNdw 63*buU8nd< swirڿ..oc//}լ۝D?-Ui nЅzoZ;J#1$!sfWt Xb٭Ƅ!ѠȥQve`XƘ.c E@vN5^/TtnFv^KrA_mA vuTD/Xc-V^`(X\*'//qE. %OaU"]P: 'z&}Ba|wzS+ruOV?Z:o;?[]G4P#΁6;A;l /h[ QӘw<=OgVz+h}@n.dߘՐX"Gd`OsOhiu5Z$ F m2g/ΤP\b.[c($39#X,MMĖ,u6PC-6=TKkUuEY/Ј0x]|[K+D<$ܴo)6ƫjد1c}]Mh=W ,oӗ XV + Χ+7^ }DwprZr5P w}Qxkښ%d}}=*sv0w\!EwU '?8%۝Ԛ1g{[=(*HdtBA%0=XRɠ6i{PLt+u#ho -qY-Z_SV' XLE5l͍ijW§Ot 3XTơO/P"RS)Ib| iy:1*{(D/;kK\PgPK'̧Ptg IT#'LxxAu47,$)DUL`hUƾ*%c2@! (XJQ w hXQ({Gm ujB/J c-lmyTkϭSy, G*c .{%<9:4Ҁy&VgrOx)9D|,mw O^Ƃpdo(Oy!6t(%(ƃH/!R S'd:pYyٺ(_]cc1-yP[[uK[G$)*C|GT+:,1;_HKr3.rgo?#8fݨy/ǵ3N4fIy 4YC ryQ\#};{Og>E5BZy(h>u,*H@^vnT R[H)#5bɖhrCƊFV&@4A'Pi'u;=( Kp"Q(:=t*Ag-,|Chv1*Lݽ)_@h҃I#hnp2i{MCܖxƘ8"~)u1J]PyԵ}]/,W 7?ډbږ"RH:s)>MAb˼2H uO(e $tWx{yI$ Pٸp)JϦYx׈e߃S޴n+ K1l@9OV|> V'vSڭPp:_*ޣUtA(7\Hwu`D:mڃ>퍊z$25ǹ[F9gq?"F5V)0r+$5er<@V%I`qKsC ~ CN+knx;&f)&i.Yn-*5{PD +*C1fѭXCDV1+F5&@HŴ(ؤ[H4nYг Y`w ʟndnR-ʷӕe%_i׆J 4$ॼc&f$Nmku^\orAc-!{Y9Fhs0])- .C7F-m"JGPbk4IacN%e 9ϕUwc_hv] D#*bs(]~9zcX'p GZf)h4x.Jaaz E}\orSؔigIڈ\ \QiBO**[KpK3TɈ`G|mዡujG=rn(zwo񡻳f4G ]oT]  .o<ʧCY$;d5PO>۽Ué2^nm-A$ѧZIc zSAByy{lM"pLXy4S)U=-\NcfCCcxmQ{l-~ MGoCKyܭ]BLq7H,B: >-sc=\k XvHׯ_FX†d@G* c;R\N{kח.Qj%- xʍ2*s@^IHox_oƆ>f4'r\ me`ɚ4'V~eqʡ\ilz;Dc#B-9nH* X2ę[43UN7a'?]hF?ֹ11Ff8Snc- ]>EUBnF _Փ\3\'PTZ~g^e ( Za/B3rG‚"Ŏ-%TQ<2)R:h■Iey·2&wƻ_eYI<1P?Z@%hfkgPy})/,sQGac~tI$467R,~h_ʸ{vG ZI$~d ~>0 >tv+bsͳk/;.JCο8$d1y(V={ ~F7aJB 7n`EwWQMxƢb&_9 zWRmzWJ{ }e2QH A~v-ޖo# m6+QdgT/19! ?Pv@aٶPO*trr3h/84HO d1?ΙVWv5%tHdn#d]Z0|<@8VHiTbYѡs3s6["((r/̖ͮ8 RȠ\2+XFfbg;qs Xa>!)\'ݺgn޴Ydr#\ b#Αs @Gsr+$` X2GC\Lhߕr"=,Fxu_ jdCm8ߞRZkBn$dAІ0$ȱ(  ]!E= 7[.>.$ ;T쯭S9m「 D>.R7B-})8G)賁w!g3~^IFm)cO%jG}XUH;k_OR(-Z]Skgq>3': yda4 u1dY_%58j is:O:PZpmckn # 2L+Gf]c$-:MS/tU\l׶ѻBvMO,ؖa Y#olgk{;$8']jCYK5C;GGQ,V'd27@s6B$3 AZ#3(QzT8Aj<&B~h4_'IzQXJN;Mk= 4YKYc,lPlDv˭P~[vC qK5QxNG4@#߅9N }*>w=+_a D/Oj9Fb< E+uFfm={h[VZ>6q~A]MQt97΁g/{z>>Y/ @zڮU6<;yoqdߐ$UHteNP.XYxp#Dn Z'H9OUxzB[C|=z(Dl1mo *yC|+1 Imwe`[uhDPO35k)lv%:mמ({Gtę{9&uۦGmZ*$扺…\Yef|L;Oƀ:kcHd4Vkp\u=Vn=_f1^e^ ؛yUyb>.s~#HEaYSg/w;R?!nZݔ68z )dp5J9-B]@zs|BOʱKU;Y1 [ Ֆ.y0?WqTrz _E)2NQx=HRFqWduQM eY>YcQtO ߄-%̠R\; Ok1KGxYЍ*NicZy X d=M%%? džtL:|f`S8-&YgolyoYkUm1clXX`Ʃq7.-@ެb6e7wqU^mޥ[x"XiK { ] XoXeoݨf/"1:%0nm|<.(Ӑ$5`^2-Ո w+"D?=aar`GPb1_,/ή˿DW"YR>*d}Egp|5,<'tV-Je7ըvI2}}$ix> 1H;7ZufCDzAZpRؼL"in@j6U-ɠR q+N?_%(.A󎐑REw,Pm7a7/2؆:#Kw :`.[6m|,4W_QT*܇<Fڪf-澾mHo}˜%ެe#f]%j=?@Һ\u`:Q߳>.xD-Ue1s.a/j9$Q4L'ʎa]/36&71KR n񭇄&kx .TKþߵ^ƖUAtO0U!Y`(2GhH$^)~=֘oͥ})ӗʖ%|MJJ*%0O< {,I!Hdaqb$U;.HIDLVV*^m;햊L-*\f0EX:89g$O;aA=ԷS,F9w6P!LGZ '6>6K1v Z.(9J eUb홂WsF6F L;˜x+N::ᕂ1NJW#ʂ\n?\(?{wkjBLbњ򧯄pF;&e$:0Bg+plojDֹ6&RCLtؤ(|'#,@bo}Ш.ռ '΀݃3E-b]l apGM++1РK*p 2,}|gv)) =v|/b ghFȰ%O?N[YTaklc-ἝBѩxR",.$ Nw]}j)rqZe =40Mq,h%d!F[yN#OHYg{A'C1\7%Ĭ$̫ؓO=v_-@#7Y,kuPLFG8A;֟=R0 4ܿڥ=m.x]/nUE᜜ Pvz8oQ{E7m22MD&-$zUŰȷnf<ѫ{#.i-`A!v {kke^e7j«mf{`:w564$\ )4=rr'fSʹ'Œ/Tyl^6͒)bYHaށ`eo|E'Ϋ+QUEՈ,x;1ɋL$}8W1q`ڞǚǏ7_Ƥ"؉ V;[Jd pԘ ؂ E׽~t5r;tˣ:&HjMky–Yyg!A#9N62upۉ S|d4`AO]j8 )3@ E#_UG> ixuzP~ReO7)Ȏ?iPbՑa{}@&l2[ߛ;%eC؞۠hqT ? {FܒW+3|"B/yuHn=^) =,]')8{aW.1Vb4,GVca,$rzj؞',FtQDE v6Qn4^5 s7Jn4K=>875MO"$PHayVce+fh-`:ܿy\l FH7Ĉk@og9BC^t-h9CH|}و+#}jn̐ۢ UXU l]ڒ\y {{Ė9w׹+Ȭ#h<0; #\:=MNfL,q@ñ(CQ,c=Z&KU.N2|<|slrGAO،$D:{"̭kDћ;IUG*z%۴-5CU06@f.ы~'ÿzPrNϣTk ^UqTSP,9փT\1R X l&~[ <Rޔ,K5;L5;kH\QxO/٠-n]P<HrR1ې.2? Ts]x^;:)Pi rUYwүxo޷B%ecS^&!mO(٠3jFѓFqE; 4Rv?Oƶtw;{/ 4Fb3w3Tb{VĦ6>ݒݚ@Sc 6]/f'ʃG"u/g/$_6Ϫn?_;VzltRY\휷ZX񫏷Xc@Q%K2{rer\f.~7Z% y..+Yⓧ f#˭px? 'ѵA@="x}m@=h؎tİR<^O769؇TX/Gkx"]>?R2[ROօ>?:}I'9ZF'րPȐ#vas]\<>f&acͰPsW9w"(eA^-⌑J~G |Xݘ1BA70;@ߎkԟ\`ygyvɛ+"-Cr.:/.lgAgRuv(IWcF޴+׈庙~2 >}{ҹ&]o 뭉1Qɒ{roP~NW9G֮HmoΫ3@F .hoU9Z;B7_*]\ ogL}y*; <)ن(9IɠYMyk(I.[t'Y.Sؖ[am9JꜝdDTfMwG&rGY4{j:ۨ҃K Cߥkq0 9 `u*5EzEw gďo?ޠ|Xn)r;#sΣZMoWhG#DQIY>Ũ0;.\fgWnGE=h2\pT%:?}eu4RXj.dn]fz_&r hG]ʂju:y0?s'Azwп~/m՟ЮH," D~xbh 0fk)/{Hh۫nἚ9#C Bwևg<?AI0 8|nEfXy,P9c\!MT}Ѳck8.ujͭĩێcQ7/LXA͊@ +x['ʞRЊI1eĒ˭#JL6Spa2}5o1 WR4 Sk1,5JGT.!cⶂmጞ{h|Q1@ =fM oI/]Q^XqX/~6]P eoۛ婭n"9BDՒ9!2h^]i/!8@~%^f 7wb#i7 ?XUiy;OM.}}m]gK_k]Bj;>=6.)+ufruN.dӯ]wÍZbǡSYF3ϴLվ;,hwfS su)ie;#tў'χn슞z'N!ghuP1[v}5m[y@[i"kʀfQOֽǥPTsj3PFt4Gi#ݵX5RyIsu|K__YNq; [LIek$Ȩβdd->OqYglZ cD11U&KY HCR A4~9R&FayoaH?{hx~X 7Eύ '(,G"?zd.]gr6u<͊Øڮ&-"vLRٽ/z NJA@Vۣ<4˛ᆶ2'}t[}RșF^ WTb: *l2m-q'X~HZ7?>M]?rS$/)3֮ܬRO~7OtGev2^le&zM_{*yīҁ'/Vs@r|?m$ <5ki ]cǕJv+]-7^GJ.6tbU䶝;&vr֥@\ ~ ߴ'AJK["z@%2M-S~^ZO?*:n]p}(pvl]-|0 Chz {kB^xSN_ʖSIz*yVPz'P? 3^ "^^^@0`GWc l> jF?m`L:MUN9+!p#'b%kO ,ujT%[k@jK'p4>\ָouYsZ¬;0QFvUՉ=F6GNG^_ZR .#-A]cT`K;Z(2lIs[6x yu~T s7&䑀XYO^Y:,RFX;,|-=ϭ1A.ʃ7{FI9W1cm&A`f[0J\I:6E*O%=([XI6j{{iJ  $yx6zBqwx}>.!eo Ct-} 7Fv"pvF<{Mj)IJ9h|Le!TAF9jy 9ToȼGPMLsΞFl[X\jT;8F;W?=6V1sqH2hoT2ċ_y>1'gы1ȌU Hջ0a ^6=@Q)q 5q>t6 9|3b^({J\<,?\T)hTI q< MUZ p&M"}\q~jpܱ֫3)d}X9q=v^KR~ E3KlP,㊤ygf(F]wYu2Vu.mMR)ݣ+wY /> 7+na.|ΊZda^Ml{4Fh )p"sEwN]ESVR:"7%ZI;S=Œ*zUkZK\/j#Bs+qI pzՕ8s(FDҨiG!jpHCOm:O  +Yyd!@^;H2Jگjר>j׫+VO o:Zc5Go|xCMxf Gn-b4˜\y{-k(E!V$R} i UUc@*丒 6Vq0.kW4fSX"]Z4ܷ *Eg'l\o_ΊY| *bքU[H#P߽W戎U#҆3Hx̍oЍO\K$٪1d|]#Z~s/κʮ ]E#E/q E4*/!tM=Cp.- -V QBIX{:;ICλE&|-%|S;k{WlqF^^SYqef7*g,ױڏ 2tBִ|.:߇klD|&1]nUaޮ-<щ/@J/ʊZD(PiE1yYӕCHn{qFqyn|`@.jT?`?=Pq?##?7ް2hs٩8BԀk`bW9baӵ5˅o?ʃXӕF/ GS:йBzO;ec瑴 #tӕT)4{:ڂB(4}1bl#T+yxѭ >qEd9!}[9u9b>?3ƒDNln"ٮz\uv ܨ@ \Fd]sq!ķ >j%=c'~ צ f"E4ėg~l?t@xxmTIGֳ k{s_Gϐ?>i?gy*p/csdiRG$nՌslӦ%7ϒBs'SR/atw@ß44l$i*&n4h9T#c1`]c#4y^6~ y%&S.օ⌋B9YaNO!?pX@G%ۼO{+&yN6p@vѥϳ\A3M+Y SFv?Ѧ{߳h%K"Et'y/jtYAg`lq,vRMuPcpv\vX_: ۗuiT:8۰߄"RRñq UI&h5Zk+v?Kx?w<}~uqBj:_#)+^;VZ5 M#@3(ȰBm@6tUn+ad_ZRs#)E\k\YM266f{]sn P;)]9h:38kg(Ǚnۦ/A T6&QKaFw;; 46T{ڷKoTh`T{xPSԻ_+7?ޮOdVQإG ĝ,"Sqce?|ԥEXov-}+71P ԕRo"ըi+ No#W֯&?3T y`?egE[QO#g[P #[+" V(d5]^\ek$Xu4Gq|rR&yIVRz-81sJh\SOr,pDAmuZBZ[󁣮TJfyc;)UΏrˮۮUC0Bz|F{fBUˈy,{{S䡱#VoJT pA&VÝo5c n7q~\ %ƝJ1kח:JQqwDk_/- l'Oւb#md5]A;T tPiwW"@ tm+.ҋ)GjRk/,Ԋa+ڃu >}h%Hڞ<3$\HߗA㈡ Ic/4|?+ȃ~л/˨yp@\Pie` }u]Jz3%{#h?u@J87*:E.I=PCIh7o f+8NBtVWw;,EsxOe <j*vV+ߥ1,kqojq<֧+L*dSAy]d2,z/Aրf2W,=vGoZ^4n y&;S[[NTJ*8o5M ,j`8Bq"ywVi|;'ډaECpͣI&0u@_m㛇2;6*anX8n\v|Hz/t%A}$^Qߵd1|Csiw zyVn5oQY'I̸]\܅{\W ]UxX#K8;h- (dλ =;1u` D8\mv4_gVj̽h5cBtsA\Cm_ÊD(6K @x͕9{t Yĭ=#vy,ያӮ<'p4L=)1qg>5r9O((1o ް=~{)h:՜22BF ,'{TAj:|ca=_haJhigbC^no<{u=4<;;Vna!-W> 3Z&Hvl:,=~b+U<¯[*HbAvFdKHPkm5IP XyչzsQ[Uf()ElSW%*K&9*/}9{ EN?[rCSc2ŏJgs1T(*~ުc IG"tWq7#!@0qh!=)+8(CȶTrQ@rXBZ?B`f/9%|-o74sd`AI@aE=9x kPKd%Rt 7C._l/ɠ@8{z-n K[Y2os t?04x7'`敻R+{߭jAjQԚ]9X`ߐcOoX5@vyvG-,#Y%=vGPh{ʽ@v%Djbl9t9u@f6J '*h< VIi)n?OZ|'Yf?A$g|LɯN/Je; Ig儅wT! fZ1^sBo imF $aK7|9c#L!ڭ6)t>Teaijo'1%Hk-E Dms])=[Ҵ"壻b9z d-6-y{տ%b}W69? ybA'҇9^ÜdBBj^d#:+2W۬@9# *; rqEf(q,{G4po ^Ay(}h <0K%Joz>'/u81'5OR$ B瑴6hdn-r=+)hlIhmhf䈖ouT}>\?#>\ AKy#ޅcdq;[uǓtk:Nkwc#s[uYF==j^Zώ&uM| .g_k[y79}kr/KASx̷4r+DTg0qp̑sX~sJV\quހgmGeɿG pl=ǕK5բ@+Ub:sFxWBhۢ ѹ{.GJ,J&TPudUaTVX|TVȒ@4M(YcbZ6y()5՜U9e~d<U {Ґ()̎5#>ijo@m'^JPKh}E*9@.ROQ*KH2q܊N/,'Q<o5O?uo۔BHlNkP24pcPhH PUrrUm;PCciivảnbgC~b'e],sr"Gp}hG}slrc6QųUַZn!Gn%|R Qjc$zn%HmLimS%~e U}) 6j<+mp;45_8~+C6@dQ݅F1 gch[3SǮ4ioBFgyw `Ke2!k !]g]jMrF d!S3-R_MxB['SK_F9 CY`q0ϷqQiyLd9['mPwb¬TGE,O_=6[\!QAq$kۢ"+5VfF4xr<_JWNVh}fnPL5(NE4NTEGF!xܒBhE,b [s6/@t:>,PǼz wIc<8 4QhC֑_%m{:‡g;@<[N zss/@ gCKk|\OTesKP0 |W TN7xЋ2σa*"+5-ۯl :ҕ;+#E60O:tkTܗ6PXTz+)nU>,AI||CTH?AHn}2b<91t/`fiyou,_Frfi&w?WnU F*{ކnSO+]Rx؞5e qV3L!wAWq&\~UļA,zV>'=ӏ¹?DvLVgoU5Sen{պۼN6:eXVYu*Qo 6ÈlVA{:  ;MimC/ciʬKa6;fO~瓥[bK|W;!Ot. 7>xc.):zf0qB֢&1|Q;\ 1tnmD^%:1NS,xxT G^!'C<ݭG#+*&q4dz*AU Ot]QxÇ1g:|T٥;c7h?:88WE^ܣj0snO(pK)|%=kHо_٠-z.4Fna@dʗVƕ#[V)VU9)UǠ, HrAeAm|5vUq(% ;-DOc Aw66×r6<ח͜h~L?pX PHƀ?5icVm5JzցˢȄP = Akx|~u_-qx>w@D4.Nqc<v=/]2aGOoN]8?&EܶxH@kצj.O R>Uft?MU%јI!5LC.6PG΂caH27(}Xp'gy@TR޵ 1-$| gkNEWk+\vC~cm,q(s,|!K\~UjIp@jq“2#:}h* ŸF Ҿ6H_$VމA;"ƺ /Qcj֖&G4'",GN#:vKJ`C*+VӰEvepF47Z$0Uz sJ{yVck|w4}آ1^h[c\*Xs'O¢kF='m*/$1@(*؁?)Za,69u@ZF;P㌋[}ʣc=N|vM3Ƨ ZרWi[\]PR>!k6q$'*J2k΀AFЙ#xmȊw:KGARFOK@}(]d2HǑ_yY'PDroAL!q:_h~oJFPz^Pzk EKAڡ]>CzA_k+fZ,ͬHuډW46)yZl&%\]PzCE=fW&E[YddGt 5ۑ ':<>C9{= "jb&K'/0C֘,c13XNN-Aq$֐g;<ƒB\xǨK  L@di'm2< ס*0y(gCq:mڂ[+9<#:*᰺ 7Cg=Ā򎀞o g9^3on[[hqITs/)Xfd<_N lR-n7v+ˊBv'm(6(Y8ZobжƟV$:‹CW)0杖Gp@<Yn&hz|%%뿥F~4PozH.a:.‚S! \X*zBnH9KPQxE cʁc&3bC2I)`nO*rѝoҥG_!WE,HY@hxt6>9:-Q]/.WLz"?fyV>L|((4(k9J9Oˑ>Znb=&>@4FuꡌmI Bfot_L^9hG K r/jzBOjKۻe {K4unnrzRD&Kh(fo]q軨%F<9,<+K^ÔQÓCA 7SfΡ\ALk_7&ܒJ覢VB+?M~;+]Wt-{F qX%ƺҡI萍W~r;?:i@Ѯ;?*􄣼@~5^iPOO=Wb@{I,O_DM.䩮K_Ckmr#ᑆ&>X@~5ۤq_t/^}*Ck[A_=PCv %^@ZH o/R>#FuEe}~tAC1fnqS7GJMo-sit.O>Aou׫WWWWWW&K!k,{SWhmk9uRSh: E~UAt~UVET$Z=r m|E 哔{\JqKhܘ sAB OXG*=H'YU U]_'P^Mx _ZAܵɹ-*3d^j}?A?κ ҽEh@tc@4=M~GQ;)J$q!K Node-path: trunk/prototype/data/images/smoke_anim.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 22443 Text-content-md5: c9b449fad54e5f1e5a26741969c5ee8a Content-length: 22453 PROPS-END PNG  IHDR,gAMA abKGD pHYs  ~tIME 8nR IDATxrʒm'%YwwZ^֝Qmْ-@̬ϟWI$K~>'/}|gQ$km'~g>mf]=_ov]mq}|n|s^ֽg"Cӌ_s|̆ןs]moGWٴvr+^>ޟvNx9ik3zl9w.ٴw?c̉ڜwM2_m[vG!e?l=zwx;lϽhw;:1zV:C:;$J[^ @G?͆Ɇ(F;j{;+De/F<Ѿ?7Ip"PvOQ{&("މwG<ɉ_J.e" 7xVX(A+Ip2 !}\+ۭzcOU}QDVHgJu7ʕ7 gC6,)tۙ ֊Vj̞ S6 K񠸗.Ly4uF9;P,|{Q51gٸ&[qJ0yY"kIҲBy }_) nbh[ iŘ !}m݇,tԓY1qʮ@=li#1S{VX8ҷ`qֻsO68zlɼMpkv9{B u6 <3Vaj&3#pKcf\8"`-gXg4*m^Ø^ƪ-jxƜxO+(Kva+wdx7VT\G܍LCf{%jgttu AMv^(|<,Jâ/ؙ؝i#A=-yX4l,&^ɧ;e;~se`HmUYx~pxfN %,xPh7c!W! mLے9޶##wϫ ![X\I2qI̞͗ EdO F[t- asPEΜ8€ebc}ϳs|w* ZB^gg2<-2R!+]yVʦ Q(3=*}N[cX2u=$X^m(c9XxBm؍ٻe4Jq<}+{ڃ6tAsd+X72: /c\8C2;4Asc)}[}V+L :hݟ./Iz md K{Y5{  7P)εW3b_x4(dxpu~}{_|#kߌ?~Nc}M6%G6-@3NR`Kgc̸ֳcV͝9q4L2HFU 3ipk¢dKx>0[nGIrm l5P| ʂ-qءCa8X)|ϴ?nО*O㙕}{\V62{_M燲W _+ 23.^NJ/zR<Fm*9O;ԜB_kAi9 =֝/FGvxkW!hdNl 1]ҝKac":V*sgCz:$@iAᷓ̂J4(~\[(]F[+E(YC6Ȋ:9CxW=uw;fw'Ai,F+dv`p9$4Vp@ޒj,daeImKtUổ's^V@4(xȵǝ7/e-6 e̩ =f wqVH`ZxZiU5rjfݐ@spwogun/' 3ѻlߘϷ¯s%`ÃT݆ ;kgɽa57mz+rxK=((Y ϦCGax jE*ߒ]w Y9C&Bp_7 ZYSr _3ro ,A#ѲPHFA0t;3өP??͡ m ($E(novo e _8.cܭ99}hg@rCĵ8o|Wߟ=$|Jf+ELk{cUƜ>0[ o 9BEWw}nJs dtXe0fSO;ЙݸA" .,CW㭠   5LӾv>eYU2(2<3O }hOd<۠ V'WSVk< ƿgS@4Lma|"<PTt!ew%Gih+M"ę%V8T@l+P,3]Ɛ!<^ cPxFC $SsƆ񰒹#ftdbա w:6L*0^h&׍PLVnln0P`VC pJ)[]g~?9ds^ڍ\鸭c"o|sJ4Ja=,N8h+@-'RAA\aClB:vnoXbT+% kJRqם8B `X,FR=U:;оnjӞ2ޒj<1eECmArOǢ{nh##A_q9sơ-7_3xXQsȯzXxAE2wbɮvpǵ FOEZi+Y^ThaMNfa% <X ^l,Ϳ!0uu~We? ֌+;r[*߅ugk%wq2sɮa #ұl[7 _e};/"+ORX5ԍyH?'Fgd;"p(apx$s5HJv& h YHVn3KvY >L8#BDq٫?7c(mⳃf -<|h٤̍a$_rmd셡&>fπrvGNVJ}QDAe@&9{[i^ m==A?&u#:ֵ &^*~UCg 2j0џQFVܮ7: 8Ju*Nlx]P^?7+!wи2s,Dɜɲ@q׹q3y]fr^ 4~OtI0t9*sӶ BPj:bI]UЖ,x=F}w>{.1IG x=r߷Zd'>(6nC(:<'qRݗB1- ^d$:KY6:2d+qct$[dv;|IعAa4x t(,ugvwմ>H\̸CEmsSN=?ۭϪ eיcWg=xG۳[8aEX}Z"$$H 0MOlXF>/OEҖݖVD[%_=웺}>UY} ce* =_cH(6d AsC[;d㓺>ӝ#tȸ{q٣y1Ӆh[iSk02gq>5QuK&C0x<;}-V$^ʪNC\d̠58͖ m^2UM>T'J;dړ Jh`Vx ^>f0ƗurB8N/'TIS;`׳lP^\lln7J&叵]E[ұQX[\*wv2#8\)R /]f 3p7,375X C_GDv>*2Xk:l.uX^xngkLZҳa&+2҅I/΄˻z|ȘpѵQtj¶cOX=3o.ly cgxǞSV d#h %:ֱή>dῳ)83]Qy&'n2;^yX" $ngG+%g_t QqoיcFO|s9D8[eWh{'<Bә?:3y<5贱=u]풐?~\NO .5o6(tE;dQvɜ71\c] 2=Zq<,=cZxWtD! JBxP)c9 ! Q6:^#oOؕ(B.9oB48y Yᚭdx )jAIf(2d̽ƙÆT'q/WaH-+ЋKxX{8/kX(S6|C1 [TV=J`+%sBr*{(C _{g$[+8[Io=&^1.Bn7ڋ}s% y>+*ɜy1/%0,hl̝!+Pj D9BY m;0`H}ypıq[&êGrȆꁱ215{tq. ҰdcQ8ƲP G(ʘ %cƸXss!ƃH3dayON/a%stnDbhp'Os>1p\ѕW3qMϋ/M QY|3r^s+Mk|ὅU~wc?/ۏ-O.c=t+aqH9rTKxY=⧩5\qN.UŅ\X CPTc/.6ZQY]}/3? w}`: adza`{k:xH>xVp/>nghaZenQ\=o2PDۨdCW&V ᝥǕs'kߑ9.~cSz@4Q2Þ-i i; "&s@2 =:K_{|LXϖ:sbyyn Sٓm-^N\JVeQR(.{YkdX1Vd0YfVoJe#{LA[ BCiȝl {]ou]nD !C'Mfr_5wv3$#-֯YւJ__^S.mH~-v[ 2wj %%kHBX",R%fC5&B`'dk&zZrYupN澚OC`O ywEtJC% Ua%OFD8d74_xj8mI"'3% IDAT `g loU# +V%aitr3Ԋt]Cth@1c8Ƈ[<,ϒBic&u|XQ,N;bhERP|``xta=okܨD 9ɜvV[v^+`ܛez-&w<ZV,.{;e$Zn11r2d /Ka93:3,+|KS#L$:sb+=K_2a#ufȝ+#ngߝ 3FfӳE '|Wb;.[y|uG6O{۫?ށ3x .8aeF{?tLh!nj04pa8m&~{WKq/PX|\})gc1׸V 7ށ(:|v/!ay$~fDYaI5JX wO,Y+0AU2g17r9ݲ%Z rN{PKL/֜@BE8chtV..$%ηD2@PhuǶyeiF{(ۿ3,5)UFaojw)G훿 ԉ d$Cpu -<<LwQbj+"w4K@xg 3+"Ox3J;2rٛ X wq(Vu7BYJbj\F[OuHyyyIН0I6 ϼ‪*C'ؚ9a|2g;q{LuPg@UF*YȠI2O\[O{$(y{-gK&YsA;Qfq߆B+nwg-K2V(bpkaCp 9y46BVgo: lg gDpJ~=Uy[pMc['_#;m̩ߖ0+; = ¢P-3 pᆳ~ƞHFul},:$G?~s $JMfpegN&aOV 7+ c}=YS ,<6emEڰ @I|`x[ 9ÀDэ=Q{cw +}zyK;1 W hh+iwd4kGzA3 ڔV^PGΜ. M1NˆN7h+3PgM=dH vo/j8 c^Ơ=_U~G{eˌhoBka]&IvNBZ*ܝZq==+=M(1*c*FLڛRRߠNT9*BQK̙?@X2{z6 .?1?V?E/Z!(:AL.+D =5^1 &L4[utjd~(epy,Wk[2%+G:  y4'Tu"#٭d""gf #ln>$]ry$-JsA(d4')&h}Jd 1lc63gtaVWNu}/z _?E +%s;Y:ҧ쮕ЅP^['K.&3nk/ :8+Ee%Zf9-~ݠ$ AWzJa dwP3N톻N33 #aYkYgڀ` Mfտqoc/V\;`.3haI?tNFE,-',+"eY B/ٝqKnę [ӭnd74<6Q] :{M~W׳8mqi࿟80نYv.MNrﻘk۳D#Ua-]aZ8ўAcF'-्GY1/H.+Ļrq#͐%PUݻve o2|ǽ-eu üdXd4 vajt>QgKUg]{Z˂pv\,#\{6P}>\vlzO2{7qIwZҾȇ1d1sVɜa­mʴu@;1'w;b3+d{@(ᇇxZˬS.qmoSt{o'jD;cIkK8ڃ2N~?êа3!EƾbLS'yl[7jV\C&aLT{_2{ C;-o7+]W#ާ$y&Җ-\d0pd|>Brmt&񲭈-WWj0cq8'KfF#OZyaXUމd'=St?+2/q% (cu$eowBn{gw[VFHh"9gD"\k8PJfߗ2fʪ+,G NLVTd m0'w.(6KY^{Ň"d6"5r`NɀI";Űer$?@ա+au'sL9b=\Vse<}C<8΃r",OÞqSX v=ۭJ D/4B6yqY-Gi9\|YBJUXo0(>@wb+cw؉w{cɥ$&tԮ*1 Z۽un !p@6m^NS5)dhs{Md9X6 2fg9ɬ:;-VlHVZ.ŀaX)jZɜr9fP,eGzR3[f3g:1Sջ2ѮLyx,.b)D큹]w\*Ye#%$OȎq};o~(dт$hVd00#>N?pO?۪> WY9 /!k { =l:^TMlǞ1遌؃bq?o%=ۘs벒ӫRX~@Xtg{ h+֞Wf,!>xR(cjt_^N]0܀km㲉I˲GOcVp~ /Y-|7\B6@RocJ~ONa9A 蒙aX +Kl=<鵷s=7?Cvߪ :c+PqT,GwO"i ɠ8vu ,qpqd2,>C pwS2" ȡ9;p>EoK.V+_m[2$.mpO˅y%p=qdn~-B2.yhߍ]ٳB!-[U.wPdbkOzol"ɌQX7rAjj)/;CI\k6ٝ!Vpw.J"_>wq,s+;Qʦ# B*uǂ/ˊq(G!N?=[Wgo-yX.*v/`\8 0,g u#E]LX `h}ya̋s?J|$3VȒxd"J8mվOAҝyxk +Ө~p- Sz.1ɢ:Z{#?I 2ke a}얽޽㑠da,PTm?(0JNP`mWs|J6i[8Aw~o@.$m3 l r=ok~;P.?pƗrɄ5?]4jO{1:ꠍ c88ȑKzݸ<ۥ7(-9eݵXH>K#hwC um1\, &Ci8\7w>~T1'r(mr"23cdw"r*ȸﭤ9tO.E $> YB.fa(ڞkWX*uB:ca Ƶ"s9K$<e 8If}6l ,ͮl1&#xVx`2^ HWؖ7jEc4:+{( r-8!m{|`/em8G*<_0zY"6\e6=Mcɘ:f]ke()%gD(: t3~ɮw3x߅b@m`س<`\7D_nd>% N!S=m2X\+(az J]K]wWvc-00 r2KA*OT\aKZ+[ q4Szņ.\c1L,1̊s.1j>o-*,!^8]N cVTt?fz? 3y00G:nmC> `|w N==JvcLJOß714gڒ3zqsѝVԑYJP1]2iXIa(7A0T]S\Rvs6۰Y_e2t f6: Ӽw)/o\5ݵY!]V'vذTpuvKpNדIDATZ gӓM ʮw _ Wev@q06*= ('Et xbdx^$cc,k}o4ABXs+'gus9 m] }KѠtz2pEJMﲫn3J^Uuh,)[ IpOF{{2z%%rآ3J<}y Bc'.~{->p V{Hc(uqj^k^d:-nO8eSuH; EŤ~j_K ߽-~Nkq)gaJ.tvdsyNg= (o +8!!t}~>gm=ǵX=ع6,yO=CӃ>46:)|c)^*Fs23Q3 8|٢C7cm ή;<mPTμG,)5C,Kw {lyogxp\@;B@0?l, 9XU8sQh׊c6RkxuЄw,{W:O( m~ʘ>S~UIM{X 3]Cΰo}q&({ XƳl*3<\{4ex G?*r/pKg[q~Wii,*-gǵAMz ޙu=H &4:+,p,ť=qdM h˲3 z'3PJuJ#"{ƴ+dUC3zJ?lq8F7 RfU(-'BayK8-ťd ,YLK]1 2q^o2o >#RwtzxY9Km E9~nX :Y\DHqeZV|q3R). ;ѣF<S{mšGio7BC̞YîJvlACۍSz]T:u=|wc3c>߼\%{bη =$ʘ!#e sN?tqqvFi=7cxU[~za+2Sx\Pjv l1k:qQ6l1l(esYu6!:EyV^),hi5E'<L)+~KuYiCVLJ@xdDl AN`e&Aq1e=|ʳZ5eyefZAc#nPTN^BCAl]ܸl'OxϕJ+4>eqZˀ`dz++{ew)2X}~ 8pth2:zEiJf!4PL^)M# AY94wُIcPnw(L۸xh<1Z7H(xjwSrCy' sKK}'+WX[20kq\zKS`ߥ2&3Fҳa!{% ziɜs AN CQX;1^=z mA{ax -dN9ZaQh<#"R"MfLڼszTi7$NªP~:4cuBrug6,}B [3/eF.-"-\h![*v]qǂWy&ޖcb(=uc*r̊ otHa Tr<|\w!8~nx[FOGXJv! ~vy +{dں @tt' ~!D$B"RV3,e(I+{y] E<Y=x 2ǙG~.қ"'-;+ q֩Zt~f;}xf,Y5N, RBgq1M 9@q6tٻ,魀fφdVD=u=ah Epc\i޻MNJ5o0% KOK-SumX-<^&0~*sS/Ibг9Nx38,P^.]haw j{.Mf]d! YCidrg%1C2yx?1tr] E:4e #gDxzŞdn4=;c$1tIs(2pƮA׌=ٟ'h0XW2+NkÒ5wt\M~gV@es6a:dLtHpA I3lV8op|Fh0:Jxl /cL\gζCC&{t%;(B+?gN{]$ZbV\ .S@y:` c0T8O<];An0v\=С1K^hO ی{o! b-*=/V+8 řy20k}GN:pIɒ|X(<{kifCSXɜH6W}<׻'$j sby<|χ?B¶r-SqR%4z.u8Dj >B0|E 0-Cl :nXpj?;8t7vE6܊y6<;5"Թk2nzȨRM];mlm%{O9י//PVąG}Ȓ8,qKVZߙL! P2+tZY[':W*E݂i(:u]Táx[ޮFBϟ?Fa=ta!4t  E*\`)AB5I2́`=E02frpM;VݘC1慇G!c]~f8App(,+#v]c@>N|N1rYoyA]2'0ރv1.C#d£<lŃB=Oᰍc>f{r~QT(7~sx@fA äq蔬|e=,%]8 o\0)/uZ_iupq1CqYYD<^G"ڇw.ra/O4 jo<qi!4 m̸āY搵)[{hV2[m=OX}pߵ%!...:/˶x]&tw QWmZm&t7^qGKO&?O!902]Wu̡Va\{܇P]y=Bk&gzZq);:,g04///9goс @Pƾȶc=*1~Pztqq>ĐBinXbpؐbS'+ZkCwZ&x\fg3Vre"4` r~io<ث ~j0.S0uۣ$V/ց-4C#}z_[Rw䐄NǧR`^ Á2&]RC#㞝(,38L;3dͅxT:@f#tp*z)ea!Φ~ٞjٿ^i5@P+ekzDH@y@9נ)e-Mt_,kիTXCV.h[dèaS׺ :sBmCC5q_haHfakn%Q1s}_Z=8-OaCՓYXzxmǨ CC0dXeL>Fx氆k֙ypJ,' ? HV4A턋ـAIxTIYGFTݢ:R# h˛dw%[i{`v祈ͯth P(R!N\6nLT֤믰Ԅߕ D})41yw,VrbαBZ3eѿLJw%*x&J-)dz@7Qn~7?A w{Q!}~/ KT^V2[N=cȂOwiAi5iO|yǰv Kjj2Z,ӳP{K>>b_iE z^wkNG?2w@9Ndw̕- L6EIENDB` Node-path: trunk/prototype/data/resources.scr Node-kind: file Node-action: change Text-content-length: 5189 Text-content-md5: 1b79bc276d771bbfdf27f16b8717f1e2 Content-length: 5189 // Animations mogli_back = data/images/lmogli_back.png (type=surface, x=0, y=0, width=52, height=86, array=5x1); mogli_front = data/images/lmogli_front.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_left = data/images/lmogli_left.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); mogli_right = data/images/lmogli_right.png (type=surface, x=0, y=0, width=52, height=86, array=8x1); // Fonts font = data/images/font.png (type=font, alphafont=1, spacelen=8, trans_limit=0.25, subtract_width=0,letters="!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); // Rest of world (autogenerated) background = data/images/background.jpg (type=surface, x=0, y=0, width=640, height=480); background2 = data/images/background2.jpg (type=surface, x=0, y=0, width=640, height=480); background2_cmap = data/images/background2_cmap.png (type=surface, x=0, y=0, width=640, height=480); background3 = data/images/background3.jpg (type=surface, x=0, y=0, width=640, height=480); background3_cmap = data/images/background3_cmap.png (type=surface, x=0, y=0, width=640, height=480); background4 = data/images/background4.jpg (type=surface, x=0, y=0, width=640, height=480); background4_cmap = data/images/background4_cmap.png (type=surface, x=0, y=0, width=640, height=480); background_cmap = data/images/background_cmap.png (type=surface, x=0, y=0, width=640, height=480); cave = data/images/cave.jpg (type=surface, x=0, y=0, width=640, height=480); cave_cmap = data/images/cave_cmap.png (type=surface, x=0, y=0, width=640, height=480); chest_closed = data/images/chest_closed.png (type=surface, x=0, y=0, width=92, height=64); chest_opened = data/images/chest_opened.png (type=surface, x=0, y=0, width=92, height=64); coin = data/images/coin.png (type=surface, x=0, y=0, width=128, height=128); console_large = data/images/console.jpg (type=surface, x=0, y=0, width=640, height=480); console = data/images/console.png (type=surface, x=0, y=0, width=59, height=67); door = data/images/door.jpg (type=surface, x=0, y=0, width=640, height=480); door_closed = data/images/door_closed.png (type=surface, x=0, y=0, width=88, height=58); door_cmap = data/images/door_cmap.png (type=surface, x=0, y=0, width=640, height=480); door_obj = data/images/door_obj.jpg (type=surface, x=0, y=0, width=256, height=420); door_opened = data/images/door_opened.png (type=surface, x=0, y=0, width=88, height=58); font = data/images/font.png (type=surface, x=0, y=0, width=1127, height=20); mointain2 = data/images/mointain2.jpg (type=surface, x=0, y=0, width=640, height=480); montain2_cmap = data/images/montain2_cmap.png (type=surface, x=0, y=0, width=640, height=480); mountain = data/images/mountain.jpg (type=surface, x=0, y=0, width=640, height=480); mountain_cmap = data/images/mountain_cmap.png (type=surface, x=0, y=0, width=640, height=480); odd = data/images/odd.png (type=surface, x=0, y=0, width=84, height=166); plant = data/images/plant.png (type=surface, x=0, y=0, width=26, height=55); retriever_coin = data/images/retriever_coin.png (type=surface, x=0, y=0, width=122, height=122); takeme = data/images/takeme.png (type=surface, x=0, y=0, width=40, height=36); tree = data/images/tree.png (type=surface, x=0, y=0, width=198, height=219); q_mark = data/images/q_mark.png (type=surface, x=0, y=0, width=35, height=35); plant2 = data/images/plant2.png (type=surface, x=0, y=0, width=24, height=65); s2_door_closed = data/images/s2_door_closed.png (type=surface, x=0, y=0, width=152, height=96); s2_door_opened = data/images/s2_door_opened.png (type=surface, x=0, y=0, width=152, height=96); background6 = data/images/background6.jpg (type=surface, x=0, y=0, width=640, height=480); background6_cmap = data/images/background6_cmap.png (type=surface, x=0, y=0, width=640, height=480); background7 = data/images/background7.jpg (type=surface, x=0, y=0, width=640, height=480); background7_cmap = data/images/background7_cmap.png (type=surface, x=0, y=0, width=640, height=480); background8 = data/images/background8.jpg (type=surface, x=0, y=0, width=640, height=480); background8_cmap = data/images/background8_cmap.png (type=surface, x=0, y=0, width=640, height=480); background9 = data/images/background9.jpg (type=surface, x=0, y=0, width=640, height=480); background9_cmap = data/images/background9_cmap.png (type=surface, x=0, y=0, width=640, height=480); stone = data/images/stone.png (type=surface, x=0, y=0, width=86, height=91); key = data/images/key.png (type=surface, x=0, y=0, width=49, height=24); inventory = data/images/inventory.png (type=surface, x=0, y=0, width=79, height=68); inventory_h = data/images/inventory_h.png (type=surface, x=0, y=0, width=79, height=68); smoke_anim = data/images/smoke_anim.png (type=surface, x=0, y=0, width=100, height=172, array=3x1); // EOF // Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3529 Text-content-md5: f70ea5e06cc055931a23e73390b380aa Content-length: 3529 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (adv:bind-surface scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (adv:bind-empty scenario1:gateway 405 105 130 225) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (adv:bind-surface scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 100) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario ;;(define game-scenario:gateway-objects ;; (list scenario1:chest ;; scenario1:door ;; scenario1:gateway)) (adv:define-scenario game-scenario:gateway "background" "background_cmap" (list scenario1:chest scenario1:gateway scenario1:door )) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Node-path: trunk/prototype/guile/scenario3.scm Node-kind: file Node-action: change Text-content-length: 2700 Text-content-md5: f25e7f5a7615b4426b70178cb7d18a2c Content-length: 2700 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Second outdoor since, the vilage ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;; ;; Smoke ;; ;;;;;;;;;;; (adv:define-object scenario3:smoke "Smoke") (adv:bind-surface scenario3:smoke "smoke_anim" 350 0 150) (define-method walk ((obj )) (c:guy:set-target 474 444 (lambda () (c:guy:set-direction 0)))) (define-method look ((obj )) (dialog:add "You see some smoke, maybe something is burning there...")) (adv:define-object outdoor2:key "Key") (adv:bind-surface outdoor2:key "key" 286 416 220) (advent:set-inventory-surface (adv:bind outdoor2:key) "key") (define-method walk ((obj )) (c:guy:set-target 316 416 #f)) (define-method pickup ((obj )) (inventory:add obj) (scenario:remove obj)) (adv:define-object outdoor2:way "back to gateway station") (adv:bind-empty outdoor2:way 560 400 80 80) (define-method walk ((obj )) (c:guy:set-target 614 439 (lambda () (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 25 433) (c:guy:set-direction 1)))) (adv:define-object outdoor2:way2 "WayToDoor") (adv:bind-empty outdoor2:way2 585 260 55 40) (define-method walk ((obj )) (c:guy:set-target 618 326 (lambda () (adv:set-scenario game-scenario:outdoor4) (c:guy:set-position 35 430) (c:guy:set-direction 1)))) (adv:define-object outdoor2:plate "plate" (activated #f)) (adv:bind-empty outdoor2:plate 210 300 40 40) (define-method look ((obj )) (dialog:add "This plate looks like an communication panel or something like that.")) (define-method use ((obj )) (dialog:add "You press a button on the panel and it seems like the panel is now activated.") (set! (activated obj) #t)) (define-method walk ((obj )) (c:guy:set-target 232 397 (lambda () (c:guy:set-direction 0)))) (define-method speak ((obj )) (cond ((activated obj) (dialog:add "Helloooo...") (dialog:add "HELLLLOOOOO") (dialog:add "Wow! What was that?")) (else (dialog:add "Helloooo...") (dialog:add "sigh... nothing happens") ))) (define game-scenario:outdoor2-objects (list outdoor2:way outdoor2:way2 outdoor2:key scenario3:smoke outdoor2:plate)) (define game-scenario:outdoor2-bind (c:scenario:make-bind "game-scenario:outdoor2" "background3" "background3_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor2-objects))) (define game-scenario:outdoor2 (make #:adv:bind game-scenario:outdoor2-bind #:adv:objs game-scenario:outdoor2-objects)) ;; EOF ;; Node-path: trunk/prototype/guile/scenario5.scm Node-kind: file Node-action: change Text-content-length: 2271 Text-content-md5: 5feda311cbfb8d904457afaa43537216 Content-length: 2271 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Fourth outdoor scene, the door ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (adv:define-object outdoor4:console "Console") (adv:bind-surface outdoor4:console "console" 250 398 228) (define-method walk ((obj )) (c:guy:set-target 245 462 #f)) (define-method look ((console )) (dialog:add "The console has a large keyhole like hole, maybe you can find a key for it?")) (define-method use ((console )) (dialog:add "You press a button but nothing happens") (dialog:add "Maybe you should place a key in the keyhole?") ) ;; (let ((obj (get-obj "door"))) ;; no need for get-obj here ;; (cond ((closed obj) ;; (set! (closed obj) #f) ;; (advent:set-surface (adv:bind obj) "door_obj")) ;; (else ;; (set! (closed obj) #t) ;; (advent:set-surface (adv:bind obj) ""))))) (define-method combine ((obj1 ) (obj2 )) (cond ((closed outdoor4:door) (set! (closed outdoor4:door) #f) (advent:set-surface (adv:bind outdoor4:door) "door_obj")) (else (set! (closed outdoor4:door) #t) (advent:set-surface (adv:bind outdoor4:door) "")))) (adv:define-object outdoor4:back "back") (adv:bind-empty outdoor4:back 0 300 70 340) (define-method walk ((obj )) (c:guy:set-target 0 426 (lambda () (adv:set-scenario game-scenario:outdoor2) (c:guy:set-position 599 326) (c:guy:set-direction 2)))) (adv:define-object outdoor4:door "Door" (closed #f)) (adv:bind-surface outdoor4:door "door_obj" 310 31 0) (define-method walk ((obj )) (c:guy:set-target 487 422 (lambda () (cond ((not (closed outdoor4:door)) (adv:set-scenario game-scenario:outdoor6) (c:guy:set-position 122 409) (c:guy:set-direction 1)))))) (define game-scenario:outdoor4-objects (list outdoor4:door outdoor4:console outdoor4:back)) (define game-scenario:outdoor4-bind (c:scenario:make-bind "game-scenario:outdoor4" "door" "door_cmap" (map (lambda (x) (adv:bind x)) game-scenario:outdoor4-objects))) (define game-scenario:outdoor4 (make #:adv:bind game-scenario:outdoor4-bind #:adv:objs game-scenario:outdoor4-objects)) ;; EOF ;; Revision-number: 36 Prop-content-length: 140 Content-length: 140 K 7 svn:log V 38 Added enter/leave hooks for scenarios K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-02-08T19:18:50.000000Z PROPS-END Node-path: trunk/prototype/guile/adventure.scm Node-kind: file Node-action: change Prop-content-length: 36 Text-content-length: 5896 Text-content-md5: e21ca83dcfa74a604abe2ea2792666db Content-length: 5932 K 14 svn:executable V 1 * PROPS-END #!/usr/bin/guile \ --debug -s !# (use-modules;; (ice-9 getopt-long) ;; (ice-9 string-fun) (oop goops)) (define *current-scenario* #f) (define *current-real-scenario* #f) (define (scenario:set scenari) (set! *current-scenario* scenario)) (define (scenario:remove obj) (scenario:remove-obj obj) (c:scenario:remove (adv:bind obj))) (define (adv:set-scenario scen) ;; Call the leave function (if (and *current-real-scenario* (adv:leave-func *current-real-scenario*)) ((adv:leave-func *current-real-scenario*))) (c:scenario:set-current (adv:bind scen)) (set! *current-scenario* (adv:objs scen)) (set! *current-real-scenario* scen) ;; Call the enter function (if (adv:enter-func *current-real-scenario*) ((adv:enter-func *current-real-scenario*)))) (define (scenario:remove-obj obj) (set! *current-scenario* (filter (lambda (x) (not (equal? obj x))) *current-scenario*))) (define (scenario:add-obj obj) (set! *current-scenario* (cons obj *current-scenario*))) (define-class () (adv:bind #:accessor adv:bind #:init-value #f #:init-keyword #:adv:bind)) (define-method name ((obj )) "") (define-method update ((obj )) #f ;;(println "Nothing to do for " (name obj)) ) (define (adv:bind-surface obj surface x y z) (set! (adv:bind obj) (advent:makeobj-surface obj surface x y z)) obj) (define (adv:bind-empty obj x-pos y-pos width height) (set! (adv:bind obj) (advent:makeobj-empty obj x-pos y-pos width height))) (define (adv:update obj) (println "Calling update for " (name obj)) (update obj)) (define-class () ;; The bind object contains a pointer back to the C++ Scenario class (adv:bind #:init-value #f #:init-keyword #:adv:bind #:accessor adv:bind) ;; The list of objects in this scenario (adv:objs #:init-value '() #:init-keyword #:adv:objs #:accessor adv:objs) (adv:enter-func #:init-value #f #:accessor adv:enter-func) (adv:leave-func #:init-value #f #:accessor adv:leave-func)) ;;(define (printf fmt . lst) ;; (display (format #f fmt lst))) (define (get-obj nme) (or (get-obj-helper nme *current-scenario*) (get-obj-helper nme *inventory*))) (define (get-obj-helper nme objs) (cond ((null? objs) #f) (else (let ((obj-name (name (car objs)))) (cond ((string=? nme obj-name) (car objs)) (else (get-obj-helper nme (cdr objs)))))))) (define (read-command) (print "Advent> ") (read-line)) (define (advent:help-command args) (cond ((equal? (length args) 1) (cond ((string=? (car args) "look") (dialog:add "look object - and here what you see.")) (else (dialog:add (string-append "Can't help you with " (car args)))))) (else (dialog:add "Commands: help, look, walk, pickup, open, close")) )) (define (advent:tokenize command-line) (cond ((eof-object? command-line) command-line) (else (filter (lambda (x) (not (or (string=? x "") (string=? x "at") (string=? x "to") (string=? x "with") (string=? x "a") (string=? x "the")))) (separate-fields-discarding-char #\space command-line list))))) ;; Verbs (define (advent:look args) (cond ((equal? (length args) 1) (look (get-obj (car args)))) (else (dialog:add "Where should I look at?")))) (define (advent:pickup args) (for-each (lambda (x) (pickup (get-obj x))) args)) (define (advent:walk args) (cond ((equal? (length args) 1) (walk (get-obj (car args)))) (else (dialog:add "Don't know where to walk.")))) (define (advent:use args) (cond ((equal? (length args) 1) (use (get-obj (car args)))) ((equal? (length args) 2) (use (get-obj (car args)) (get-obj (cadr args)))) (else (dialog:add "Don't know what you mean")))) ;;(define (advent:open args) ;; (cond ((equal? (length args) 1) ;; (gopen (get-obj (car args)))) ;; (else ;; (dialog:add "Don't know what you mean.")) ;; )) ;;(define-method gopen ((obj )) ;; (dialog:add "Don't know what you mean.")) (define-method combine ((obj1 ) (obj2 )) (dialog:add "Don't know of to combine this two objects")) ;;(define-method gopen ((obj )) ;; (dialog:add "I can't open this ")); (name obj))) (define *inventory* '()) (define-method add-inventory ((obj )) (cond ((not (inventory-has obj)) (set! *inventory* (cons obj *inventory*)) (dialog:add (string-append "You picked up a " (name obj)))) (else (dialog:add (string-append "You already have this " (name obj)))))) (define-method inventory-has ((obj )) (member obj *inventory*)) (define (advent:close args) (cond ((equal? (length args) 1) (gclose (get-obj (car args)))) (else (dialog:add "Don't know what you mean." args)) )) (define (advent:eval command-line) (let ((token (advent:tokenize command-line))) (cond ((eof-object? command-line) (exit 0)) ((null? token) '()) (else (let ((command (car token)) (args (cdr token))) (cond ((string=? command "quit") (dialog:add "Bye, bye") (exit 0)) ((string=? command "help") (advent:help-command args)) ((string=? command "look") (advent:look args)) ((string=? command "walk") (advent:walk args)) ((string=? command "pickup") (advent:pickup args)) ((string=? command "use") (advent:use args)) ((string=? command "open") (advent:open args)) ((string=? command "inventory") (inventory:show)) ;; (dialog:add "Invectory: ") ;; (println *inventory*)) (else (println "- unknown command: " command)))))))) (load "helper.scm") (define (dialog:add str) (dialog:add2 str) (println str)) (load "syntax-ext.scm") (load "objects.scm") (println "Adventure V0.0") ;; EOF ;; Node-path: trunk/prototype/guile/scenario1.scm Node-kind: file Node-action: change Text-content-length: 3727 Text-content-md5: b139d60ccfa95be5f24adb715af68201 Content-length: 3727 ;;;;;;;;;;; ;; Chest ;; ;;;;;;;;;;; ;; We define an object, which can be referenced as "scenario1:chest" (adv:define-object scenario1:chest "Chest" (closed #t)) ;; The object has a state variable ;; closed, which will be #t by default ;; Connect the scm object to the c++ world... (adv:bind-surface scenario1:chest "chest_closed" 214 331 230) (println "scenario1:chest: " (adv:bind scenario1:chest)) (advent:set-inventory-surface (adv:bind scenario1:chest) "chest_closed") ;;;;;;;;;;;;; ;; Gateway ;; ;;;;;;;;;;;;; (adv:define-object scenario1:gateway "Gateway") (adv:bind-empty scenario1:gateway 405 105 130 225) (define-method use ((obj )) (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)) (define-method walk ((obj )) (println "DOING SOMENTHING") (c:guy:set-target 424 324 (lambda () (adv:set-scenario game-scenario:outdoor3) (c:guy:set-position 450 340) (c:guy:set-direction 3)))) ;;;;;;;;;; ;; Door ;; ;;;;;;;;;; (adv:define-object scenario1:door "Door" (closed #t)) (adv:bind-surface scenario1:door "door_closed" 198 211 0) (define-method walk ((obj )) (c:guy:set-target 244 278 (lambda () (cond ((not (closed obj)) (adv:set-scenario game-scenario:outdoor) (c:guy:set-position 300 340) (c:guy:set-direction 2)) (else (println "Door is closed.")))))) (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "door_opened") (set! (closed obj) #f)) (else (advent:set-surface (adv:bind obj) "door_closed") (set! (closed obj) #t)))) (define (random-ref lst) (list-ref lst (random (length lst)))) (define scenario1:chest-counter 0) (define-method walk ((obj )) (c:guy:set-target 308 391 (lambda () (c:guy:set-direction 3)))) ;; The update methode is called once a game loop (15 times per second) (define-method update ((obj )) (set! scenario1:chest-counter (1+ scenario1:chest-counter)) (cond ((> scenario1:chest-counter 400) (set! scenario1:chest-counter 0) (dialog:add (random-ref '("...something is waiting for you..." "...your dreams might come true..." "...is this really happening..." "...is their a life before death..." "...will this ever have an end..." ))) )) ;;(println "Updating chest") ) ;; This methode is involved when an open action (a click on the coin) ;; is performed (define-method use ((obj )) (cond ((closed obj) (advent:set-surface (adv:bind obj) "chest_opened") (set! (closed obj) #f) (dialog:add "Opened chest")) (else (advent:set-surface (adv:bind obj) "chest_closed") (dialog:add "Closed chest") (set! (closed obj) #t)) )) (define-method pickup ((obj )) (println "Trying to pick up the chest...") (inventory:add obj) (scenario:remove obj) (println "Picked up chest")) ;; We add all objects to the scenario ;;(define game-scenario:gateway-objects ;; (list scenario1:chest ;; scenario1:door ;; scenario1:gateway)) (adv:define-scenario game-scenario:gateway "background" "background_cmap" (list scenario1:chest scenario1:gateway scenario1:door )) (set! (adv:enter-func game-scenario:gateway) (lambda () (println "enter game-scenario"))) (set! (adv:leave-func game-scenario:gateway) (lambda () (println "leave game-scenario"))) #! Wanabe Syntax: (adv:define-scenario scenario:gateway #:surface "background" #:colmap "background_cmap" #:objects '(scenario1:chest scenario1:door)) !# ;; EOF ;; Revision-number: 37 Prop-content-length: 161 Content-length: 161 K 7 svn:log V 57 I'll give it another try now that netobjects are working K 10 svn:author V 9 cybernerd K 8 svn:date V 27 2001-03-02T06:21:20.000000Z PROPS-END Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: change Text-content-length: 12749 Text-content-md5: 7f81d419af01cb5129c6eddbd467d29b Content-length: 12749 # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh helper.hh helper.cc # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o \ ScenarioSmob.o Dialog.o Guy.o helper.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best DEP_FILES = .deps/Advent.P .deps/AdventObj.P .deps/AdventObjSmob.P \ .deps/Background.P .deps/Coin.P .deps/CollisionMap.P .deps/Dialog.P \ .deps/Font.P .deps/GuileAdventObj.P .deps/Guy.P .deps/Inventory.P \ .deps/Scenario.P .deps/ScenarioSmob.P .deps/helper.P SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp %.o: %.cc @echo '$(CXXCOMPILE) -c $<'; \ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.cc @echo '$(LTCXXCOMPILE) -c $<'; \ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-depend distclean-generic \ clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir mostlyclean-depend \ distclean-depend clean-depend maintainer-clean-depend info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Revision-number: 38 Prop-content-length: 173 Content-length: 173 K 7 svn:log V 71 * Rewrote some parts of the mouse handling * Fixed the inventory a bit K 10 svn:author V 7 grumbel K 8 svn:date V 27 2001-03-03T13:30:00.000000Z PROPS-END Node-path: trunk/prototype/Advent.cc Node-kind: file Node-action: change Text-content-length: 4360 Text-content-md5: d6f0082d43af70756e777af3f5db7ecd Content-length: 4360 // $Id: Advent.cc,v 1.10 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include // Static extern "C" { void scm_init_oop_goops_goopscore_module (void); } #include #include "Scenario.hh" #include "Coin.hh" #include "Advent.hh" #include "Font.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" #include "Dialog.hh" #include "Inventory.hh" #include "Guy.hh" #include "ClickManager.hh" Advent app; // Wrapper to call the member func void inner_main (void* closure, int argc, char* argv[]) { app.inner_main (closure, argc, argv); } Advent::Advent () { } char* Advent::get_title () { return "Advent - Prototype"; } int Advent::main (int argc, char* argv[]) { std::cout << "Starting guile..." << std::endl; scm_boot_guile (argc, argv,::inner_main, 0); std::cout << "this should never be reached..." << std::endl; return 0; } void Advent::inner_main (void* closure, int argc, char* argv[]) { bool fullscreen = false; // Debuging on SCM_DEVAL_P = 1; SCM_BACKTRACE_P = 1; SCM_RECORD_POSITIONS_P = 1; SCM_RESET_DEBUG_MODE; // This is used for the static binary #ifdef ADVENT_STATIC scm_init_oop_goops_goopscore_module (); #endif std::cout << "Loading guile code..." << std::endl; AdventObjSmob::init (); ScenarioSmob::init (); Dialog::init (); Inventory::init (); Guy::init_guile (); std::cout << "Loading guile code...done" << std::endl; if (argc == 2) { if (strcmp (argv[1], "--fullscreen") == 0) { fullscreen = true; } } try { std::cout << "Advent: Init ClanLib..." << std::endl; CL_SetupCore::init (); CL_SetupCore::init_display (); CL_SetupPNG::init (); CL_SetupJPEG::init (); CL_Display::set_videomode (640, 480, 16, fullscreen, false); resource = CL_ResourceManager::create("data/resources.scr", false); //Scenario scenario; coin = new Coin (); // FIXME: wrong place to create this... the_guy = new Guy (); std::cout << "Loading guile code..." << std::endl; gh_load ("guile/adventure.scm"); std::cout << "Loading guile code...done" << std::endl; int time = CL_System::get_time (); int count = 0; char str[256] = {"Calculation"}; ClickManager click_manager; inventory = new Inventory (); click_manager.add (inventory); click_manager.add (coin); click_manager.add (the_guy); //gh_eval_str("(let ((obj (advent:makeobj \"testobj\" \"takeme\" 400 100 100))) (println obj))"); assert (Scenario::current); while (CL_Keyboard::get_keycode (CL_KEY_ESCAPE) == 0) { Scenario::current->update (); coin->update (); dialog.update (); inventory->update (); Scenario::current->draw (); coin->draw (); inventory->draw (); font ("font")->print_left (0, 0, str); dialog.draw (); if (count > 9) { int time_diff = CL_System::get_time () - time; //std::cout << "fps: " << 10000.0 / time_diff << std::endl; sprintf (str, "fps: %f", 10000.0 / time_diff); //std::cout << "Str: " << str << std::endl; count = 0; time = CL_System::get_time (); } CL_Display::flip_display (); count++; CL_System::keep_alive (); } CL_SetupJPEG::deinit (); CL_SetupPNG::deinit (); CL_SetupCore::deinit_display (); CL_SetupCore::deinit (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.cc Node-kind: file Node-action: change Text-content-length: 5458 Text-content-md5: 2f0dbb57fa54ca6372d574b5afb7b28b Content-length: 5458 // $Id: AdventObjSmob.cc,v 1.11 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include #include "helper.hh" #include "Advent.hh" #include "AdventObj.hh" #include "GuileAdventObj.hh" #include "AdventObjSmob.hh" #include "Scenario.hh" long AdventObjSmob::tag; void AdventObjSmob::init () { tag = scm_make_smob_type ("AdventObj", sizeof (AdventObjP)); scm_set_smob_mark (tag, &AdventObjSmob::mark); scm_set_smob_free (tag, &AdventObjSmob::free); scm_set_smob_print (tag, &AdventObjSmob::print); gh_new_procedure5_0("advent:makeobj-surface", AdventObjSmob::makeobj_surface); gh_new_procedure5_0 ("advent:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure5_0 ("c:adv:makeobj-empty", AdventObjSmob::makeobj_empty); gh_new_procedure2_0("advent:set-surface", AdventObjSmob::set_surface); gh_new_procedure4_0("c:advent:set-surface-pos", AdventObjSmob::set_surface_pos); gh_new_procedure2_0("advent:set-inventory-surface", AdventObjSmob::set_inventory_surface); } SCM AdventObjSmob::mark (SCM smob) { //std::cout << ">>Marking AdventObjSmob<<" << std::endl; return SCM_UNSPECIFIED; } scm_sizet AdventObjSmob::free (SCM smob) { GuileAdventObj* obj = scm2GuileAdventObj (smob); std::cout << ">>Freeing AdventObjSmob: " << obj->get_name () << "<<"<< std::endl; return 0; } int AdventObjSmob::print (SCM smob, SCM port, scm_print_state *pstate) { std::cout << ">>Printing AdventObjSmob<<" << std::endl; AdventObjP* obj = reinterpret_cast(SCM_CDR (smob)); if (obj) { //std::cout << "STR: " << obj->obj->get_name () << std::endl; scm_puts ("#", port); } else { scm_puts ("#", port); } /* non-zero means success */ return 1; } SCM AdventObjSmob::makeobj_empty (SCM arg_name, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); obj->obj = new GuileAdventObj (arg_name, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::scm_makeobj_empty (SCM obj, SCM arg_x_pos, SCM arg_y_pos, SCM arg_width, SCM arg_height) { AdventObjP* advobj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); advobj->obj = new GuileAdventObj (obj, CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos)), SCM_INUM (arg_width), SCM_INUM (arg_height)); SCM_RETURN_NEWSMOB (tag, advobj); } SCM AdventObjSmob::makeobj_surface (SCM arg_name, SCM arg_surface, SCM arg_x_pos, SCM arg_y_pos, SCM arg_z_pos) { // FIXMME: Error checking is missing AdventObjP* obj = (AdventObjP*)scm_must_malloc (sizeof (AdventObjP), "AdventObjP"); if (strcmp(SCM_CHARS (arg_surface), "") != 0) { obj->obj = new GuileAdventObj (arg_name, CL_Surface (SCM_CHARS(arg_surface), app.get_resource ()), CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM(arg_y_pos), SCM_INUM(arg_z_pos))); } else { assert (false); } SCM_RETURN_NEWSMOB (tag, obj); } SCM AdventObjSmob::set_surface_pos (SCM smob, SCM x_pos, SCM y_pos, SCM z_pos) { AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { obj->set_surface_pos (SCM_INUM(x_pos), SCM_INUM(y_pos), SCM_INUM(z_pos)); } else { std::cout << "KAPUTT@2" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_surface (SCM smob, SCM name) { //std::cout << "Setting surface" << std::endl; AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* obj = dynamic_cast(advobj->obj); if (obj) { char* str = SCM_CHARS(name); puts ("set_surface..."); puts (str); //std::cout << "Pointer: " << obj << " " << obj->obj << std::endl; obj->set_surface (str); } else { std::cout << "KAPUTT" << std::endl; } return SCM_UNSPECIFIED; } SCM AdventObjSmob::set_inventory_surface (SCM obj, SCM name) { std::cout << "AdventObjSmob::set_inventory_surface" << std::endl; std::cout << "name: " << SCM_CHARS (name) << std::endl; GuileAdventObj* advobj = scm2GuileAdventObj (obj); std::cout << "Pointer: " << advobj << std::endl; advobj->set_inventory_surface (SCM_CHARS (name)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/AdventObjSmob.hh Node-kind: file Node-action: change Text-content-length: 1712 Text-content-md5: f37c0e194ee3ced03a180cc8f8a0f823 Content-length: 1712 // $Id: AdventObjSmob.hh,v 1.7 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ADVENTOBJSMOB_HH #define ADVENTOBJSMOB_HH #include "GuileAdventObj.hh" struct AdventObjP { AdventObj* obj; }; class AdventObjSmob { private: static long tag; public: static void init (); static scm_sizet free (SCM smob); static SCM mark (SCM smob); static int print (SCM image_smob, SCM port, scm_print_state *pstate); static SCM makeobj_surface (SCM name, SCM surface, SCM x_pos, SCM y_pos, SCM z_pos); static SCM scm_makeobj_empty (SCM obj, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM makeobj_empty (SCM name, SCM x_pos, SCM y_pos, SCM width, SCM height); static SCM set_surface (SCM obj, SCM name); static SCM set_inventory_surface (SCM obj, SCM name); static SCM set_surface_pos (SCM smob, SCM x_pos, SCM y_pos, SCM z_pos); }; #endif /* EOF */ Node-path: trunk/prototype/ClickManager.cc Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 3010 Text-content-md5: 504f014d4155d8754b7c4ba5c042bbce Content-length: 3020 PROPS-END // $Id: ClickManager.cc,v 1.1 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "ClickManager.hh" static bool prio_sort (Clickable* a, Clickable* b) { return (a->priority () > b->priority ()); } ClickManager::ClickManager () { on_button_press_slot = CL_Input::sig_button_press.connect (thCreateSlot(this, &ClickManager::on_button_press)); on_button_release_slot = CL_Input::sig_button_release.connect (thCreateSlot(this, &ClickManager::on_button_release)); } Clickable* ClickManager::get_active (int x_pos, int y_pos) { for (std::list::iterator i = clickables.begin (); i != clickables.end (); ++i) { std::cout << "active: " << *i << std::endl; if ((*i)->mouse_over (x_pos, y_pos)) { return *i; } } return NULL; } void ClickManager::on_button_press(CL_InputDevice *device, const CL_Key &key) { clickables.sort (prio_sort); std::cout << "CLICKMANAGER: press" << std::endl; for (std::list::iterator i = clickables.begin (); i != clickables.end (); ++i) { if ((*i)->mouse_over (key.x, key.y)) { currently_pressed.push_back (*i); if ((*i)->on_mouse_press (key)) return; } } } void ClickManager::on_button_release(CL_InputDevice *device, const CL_Key &key) { clickables.sort (prio_sort); std::cout << "CLICKMANAGER: release" << std::endl; for (std::list::iterator i = clickables.begin (); i != clickables.end (); ++i) { if ((*i)->mouse_over (key.x, key.y) && (*i)->on_mouse_release (key)) { break; } } for (std::list::iterator i = currently_pressed.begin (); i != currently_pressed.end (); ++i) { if ((*i)->mouse_over (key.x, key.y) && (*i)->on_mouse_click (key)) break; } currently_pressed.clear (); } void ClickManager::add (Clickable* a) { clickables.push_back (a); clickables.sort (prio_sort); std::cout << "After sort: " << clickables.size () << std::endl; for (std::list::iterator i = clickables.begin (); i != clickables.end (); ++i) { std::cout << "Obj: " << *i << " " << (*i)->priority () << std::endl; } } /* EOF */ Node-path: trunk/prototype/ClickManager.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1473 Text-content-md5: 4c55861661db25964c7b82234c9f361a Content-length: 1483 PROPS-END // $Id: ClickManager.hh,v 1.1 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef CLICKMANAGER_HH #define CLICKMANAGER_HH #include #include #include "Clickable.hh" class ClickManager { private: std::list clickables; thSlot on_button_press_slot; thSlot on_button_release_slot; std::list currently_pressed; public: ClickManager (); ~ClickManager () {} void add (Clickable* a); void on_button_press(CL_InputDevice *device, const CL_Key &key); void on_button_release(CL_InputDevice *device, const CL_Key &key); private: Clickable* get_active (int x_pos, int y_pos); }; #endif /* EOF */ Node-path: trunk/prototype/Clickable.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1480 Text-content-md5: fbaf6ad09fdd7fe659ec2999dc54a082 Content-length: 1490 PROPS-END // $Id: Clickable.hh,v 1.1 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef CLICKABLE_HH #define CLICKABLE_HH class Clickable { public: /// @return true if the click got catched, false if the click was not used virtual bool on_mouse_press (const CL_Key&) { return false; } /// @return true if the click got catched, false if the click was not used virtual bool on_mouse_click (const CL_Key&) { return false; } /// @return true if the click got catched, false if the click was not used virtual bool on_mouse_release (const CL_Key&) { return false; } virtual float priority () =0; virtual bool mouse_over (int, int) =0; }; #endif /* EOF */ Node-path: trunk/prototype/Coin.cc Node-kind: file Node-action: change Text-content-length: 4683 Text-content-md5: 40038ac81192ee18ad2c449c4cda8583 Content-length: 4683 // $Id: Coin.cc,v 1.10 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include "GuileAdventObj.hh" #include "Font.hh" #include "AdventObj.hh" #include "Advent.hh" #include "Coin.hh" Coin* coin; Coin::Coin () { visible = false; sur = CL_Surface ("retriever_coin", app.get_resource ()); q_mark = CL_Surface ("q_mark", app.get_resource ()); marked_obj = 0; current_obj = 0; ignore_press = false; } void Coin::draw () { if (current_obj) { current_obj->draw_inventory (CL_Mouse::get_x (), CL_Mouse::get_y ()); } if (visible) { sur.put_screen (x_pos - sur.get_width ()/2, y_pos - sur.get_height ()/2); } AdventObj* obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (obj) { font ("font")->print_center (320, 460, obj->get_name ().c_str ()); if (!visible) q_mark.put_screen (CL_Mouse::get_x () - q_mark.get_width ()/2, CL_Mouse::get_y () - q_mark.get_height ()/2); } } void Coin::update () { } void Coin::set_current_obj (AdventObj* obj) { std::cout << "Setting current_obj" << std::endl; current_obj = obj; } bool Coin::on_mouse_press(const CL_Key& key) { std::cout << "Coin pressed: " << key.id << std::endl; if (key.id == 2) { marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { visible = true; x_pos = (int) key.x; y_pos = (int)key.y; } return true; } return false; } bool Coin::on_mouse_release (const CL_Key& key) { std::cout << "Coin released: " << key.id << std::endl; if (key.id == 0 && current_obj) { if (ignore_press) ignore_press = false; else { AdventObj* marked_obj = Scenario::current->get_object (CL_Mouse::get_x (), CL_Mouse::get_y ()); if (marked_obj) { GuileAdventObj* obj = dynamic_cast(marked_obj); GuileAdventObj* cobj = dynamic_cast(current_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; current_obj = 0; } else { std::cout << "Use: " << current_obj->get_name () << " with " << obj->get_name () << std::endl; gh_call2 (gh_lookup ("combine"), cobj->get_scm (), obj->get_scm ()); current_obj = 0; } } else { current_obj = 0; } } return true; } else if (key.id == 2) { visible = false; GuileAdventObj* obj = dynamic_cast(marked_obj); if (!obj) { std::cout << "Don't know what to do with non GuileObj." << std::endl; } else { std::cout << "Action on: " << marked_obj->get_name () << std::endl; std::cout << "Key: " << key.x << " " << key.y << std::endl; std::cout << "Pos: " << x_pos << " " << y_pos << std::endl; std::cout << "Width: " << sur.get_width () << " " << "Height: " << sur.get_height() << std::endl; if (key.x > x_pos - ((int)sur.get_width ()/2) && key.x < x_pos + ((int) sur.get_width ()/2) && key.y > y_pos - ((int) sur.get_height ()/2) && key.y < y_pos + ((int) sur.get_height ()/2)) { if (key.x < x_pos && key.y < y_pos) { gh_call1 (gh_lookup ("use"), obj->get_scm ()); } else if (key.x > x_pos && key.y < y_pos) { gh_call1 (gh_lookup ("look"), obj->get_scm ()); } else if (key.x < x_pos && key.y > y_pos) { gh_call1 (gh_lookup("pickup"), obj->get_scm ()); } else if (key.x > x_pos && key.y > y_pos) { gh_call1 (gh_lookup("speak"), obj->get_scm ()); } else { std::cout << "Coin: don't know what to do, !@#$" << std::endl; } } else { std::cout << "Coin: left coin region" << std::endl; } } return true; } return false; } float Coin::priority () { return 0.5; } /* EOF */ Node-path: trunk/prototype/Coin.hh Node-kind: file Node-action: change Text-content-length: 1531 Text-content-md5: 29a24614298a883cd69abf9fafca8483 Content-length: 1531 // $Id: Coin.hh,v 1.5 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef COIN_HH #define COIN_HH #include #include "Scenario.hh" #include "Clickable.hh" class Coin : public Clickable { private: CL_Surface sur; CL_Surface q_mark; bool visible; int x_pos, y_pos; AdventObj* marked_obj; // The object which the guy helds in his hands AdventObj* current_obj; bool ignore_press; public: Coin (); virtual ~Coin () {} void set_current_obj (AdventObj* obj); void draw (); void update (); bool on_mouse_press (const CL_Key&); bool on_mouse_release (const CL_Key&); float priority (); bool mouse_over (int, int) { return true; } }; extern Coin* coin; #endif /* EOF */ Node-path: trunk/prototype/GuileAdventObj.cc Node-kind: file Node-action: change Text-content-length: 4505 Text-content-md5: ca9af95b4642eea33ff8360e7e60b553 Content-length: 4505 // $Id: GuileAdventObj.cc,v 1.12 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "Advent.hh" #include "GuileAdventObj.hh" GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector arg_pos) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS (arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; sur = arg_sur; pos = arg_pos; width = sur.get_width (); height = sur.get_height (); } GuileAdventObj::GuileAdventObj (SCM arg_name, CL_Vector arg_pos, int arg_width, int arg_height) : pos (arg_pos), width (arg_width), height (arg_height) { if (SCM_STRINGP (arg_name)) { scm_object = SCM_BOOL_F; name = SCM_CHARS(arg_name); } else { scm_object = arg_name; name = SCM_CHARS (gh_call1 (gh_lookup ("name"), scm_object)); } surface_visible = true; } SCM GuileAdventObj::call (std::string func) { if (SCM_BOOL_F == scm_object) { puts ("don't have scm object for call"); return SCM_BOOL_F; } else { char* str = strdup (func.c_str ()); SCM ret_val = gh_call1 (gh_lookup (str), scm_object); free (str); return ret_val; } } void GuileAdventObj::call (std::string func, std::string id) { std::string call = "(advent:eval \""; call += func; call += " "; call += id; call += "\")"; std::cout << "Call: " << call << std::endl; char* str = strdup (call.c_str ()); gh_eval_str (str); free (str); } void GuileAdventObj::update () { //char command[1024]; // std::cout << "Updating..." << std::endl; //sprintf (command, "(println (name \"guile updating\")"); //gh_eval_str (command); if (SCM_NFALSEP (scm_object)) { // printf ("bool: %d", scm_object); // printf ("GUILE: LOOKUP: %s\n", name.c_str ()); gh_call1 (gh_lookup ("update"), scm_object); // puts ("GUILE: LOOKUP DONE"); } else { //puts ("no ); } } void GuileAdventObj::draw_world () { if (sur && surface_visible) { if (sur.get_num_frames () == 1) sur.put_screen (pos.x, pos.y); else { if (counter >= ((int) sur.get_num_frames ()*10)) counter = 0; sur.put_screen (pos.x, pos.y, counter++/10); } } } void GuileAdventObj::draw_inventory (int x, int y) { //std::cout << "Drawing Inv. Object: " << x << " " << y << std::endl; if (inventory_sur) inventory_sur.put_screen (x, y); } bool GuileAdventObj::is_at (int x, int y) { if (pos.x <= x && pos.x + width > x && pos.y <= y && pos.y + height > y) { return true; } return false; } void GuileAdventObj::set_inventory_surface (std::string str) { std::cout << "set_inventory_surface()" << std::endl; try { inventory_sur = CL_Surface (str.c_str (), app.get_resource ()); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } void GuileAdventObj::set_surface_pos (int x_pos, int y_pos, int z_pos) { pos = CL_Vector (x_pos, y_pos); } void GuileAdventObj::set_surface (std::string str) { if (!str.empty ()) { try { std::cout << "GuileAdventObj: set_surface: " << str << std::endl; sur = CL_Surface (str.c_str (), app.get_resource ()); surface_visible = true; width = sur.get_width (); height = sur.get_height (); } catch (CL_Error err) { std::cout << "CL_Error: " << err.message << std::endl; } } else { surface_visible = false; // ClanLib BUG // sur = CL_Surface (); } } /* EOF */ Node-path: trunk/prototype/GuileAdventObj.hh Node-kind: file Node-action: change Text-content-length: 2283 Text-content-md5: 38f5de2685a80e14d1fb215d393aae3f Content-length: 2283 // $Id: GuileAdventObj.hh,v 1.9 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUILEADVENTOBJ_HH #define GUILEADVENTOBJ_HH #include #include #include "AdventObj.hh" class GuileAdventObj : public AdventObj { private: std::string name; SCM scm_object; /// The uniq id of this object instance int id; bool surface_visible; CL_Surface sur; CL_Surface inventory_sur; CL_Vector pos; int width; int height; int counter; public: /// Empty default constructor GuileAdventObj (SCM arg_name, CL_Surface arg_sur, CL_Vector pos); GuileAdventObj (SCM arg_name, CL_Vector pos, int arg_width, int arg_height); /// Empty default destructor virtual ~GuileAdventObj () {} /// Update the status of the object, this function is called once an /// event loop virtual void update (); /// Draw the object to the world virtual void draw_world (); /// Draw the object into the inventory virtual void draw_inventory (int x, int y); virtual void call (std::string func, std::string id); SCM call (std::string func); SCM get_scm () { return scm_object; } virtual bool is_at (int x, int y); virtual std::string get_name () { return name; } virtual float get_z_pos () { return pos.z; } virtual void set_surface (std::string str); virtual void set_surface_pos (int x_pos, int y_pos, int z_pos); virtual void set_inventory_surface (std::string str); }; #endif /* EOF */ Node-path: trunk/prototype/Guy.cc Node-kind: file Node-action: change Text-content-length: 5339 Text-content-md5: 93aa608a1b64ec03f8e2f2a6b1dfcdfc Content-length: 5339 // $Id: Guy.cc,v 1.6 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "GuileAdventObj.hh" #include "Advent.hh" #include "Scenario.hh" #include "Guy.hh" Guy* the_guy; Guy::Guy () { sur_front = CL_Surface ("mogli_front", app.get_resource ()); sur_back = CL_Surface ("mogli_back", app.get_resource ()); sur_left = CL_Surface ("mogli_left", app.get_resource ()); sur_right = CL_Surface ("mogli_right", app.get_resource ()); counter = 0; pos.x = 320; pos.y = 400; target = pos; delta = 4.0; target_callback = SCM_BOOL_F; } Guy::~Guy () { } void Guy::update () { // update animation if (target != pos) { counter++; if (counter > 7) counter = 0; if (on_target ()) { target = pos; } else { CL_Vector tmp_pos = pos + direction; if (Scenario::current->get_colmap ()->get_pixel (tmp_pos.x, tmp_pos.y) != 0) { pos = tmp_pos; pos.z = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y); } else { target = pos; } } } else { if (target_callback != SCM_BOOL_F) { gh_call0 (target_callback); target_callback = SCM_BOOL_F; } counter = 0; } } bool Guy::on_target () { if (pos.x - delta < target.x && pos.x + delta > target.x && pos.y - delta < target.y && pos.y + delta > target.y) { return true; } return false; } void Guy::draw_world () { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; CL_Surface* sur; if (fabs(direction.x) < fabs(direction.y)) { if (direction.y > 0) sur = &sur_front; else sur = &sur_back; } else { if (direction.x > 0) sur = &sur_right; else sur = &sur_left; } sur->put_screen (pos.x - (sur->get_width ()/2 * zoom), pos.y - (sur->get_height () * zoom), zoom, zoom, counter % sur->get_num_frames ()); //std::cout << "Zoom: " << zoom << std::endl; } bool Guy::on_mouse_click(const CL_Key &key) { if (key.id == 0) { AdventObj* obj = Scenario::current->get_object (key.x, key.y); GuileAdventObj* guile_obj = dynamic_cast(obj); if (obj && guile_obj) { //std::cout << "Issued walkto event" << std::endl; //std::cout << "Obj: " << obj << " name: " << guile_obj->get_name () << std::endl; if (guile_obj->call ("walk") == SCM_BOOL_F) { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } } else { // Walk to the given position direction = CL_Vector (key.x - pos.x, key.y - pos.y); direction.normalize (); direction *= 5.0; target = CL_Vector (key.x, key.y); } return true; } return false; } bool Guy::is_at (int x, int y) { float zoom = Scenario::current->get_colmap ()->get_pixel (pos.x, pos.y) / 255.0; if (pos.x - zoom*sur_left.get_width()/2 < x && pos.x + zoom*sur_left.get_width()/2 > x && pos.y > y && pos.y - zoom*sur_left.get_height () < y) { return true; } return false; } void Guy::init_guile () { gh_new_procedure2_0 ("c:guy:set-position", &Guy::scm_set_pos); gh_new_procedure1_0 ("c:guy:set-direction", &Guy::scm_set_direction); gh_new_procedure3_0 ("c:guy:set-target", &Guy::scm_set_target); } SCM Guy::scm_set_pos (SCM arg_x_pos, SCM arg_y_pos) { the_guy->pos.x = SCM_INUM (arg_x_pos); the_guy->pos.y = SCM_INUM (arg_y_pos); the_guy->target = the_guy->pos; return SCM_UNSPECIFIED; } SCM Guy::scm_set_direction (SCM angle) { switch (SCM_INUM (angle)) { case 0: // up the_guy->direction = CL_Vector (0., -5.); break; case 1: // right the_guy->direction = CL_Vector (5., 0.); break; case 2: // down the_guy->direction = CL_Vector (0., 5.); break; case 3: // left the_guy->direction = CL_Vector (-5., 0.); break; } return SCM_UNSPECIFIED; } SCM Guy::scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback) { the_guy->direction = CL_Vector (SCM_INUM(arg_x_pos) - the_guy->pos.x, SCM_INUM (arg_y_pos) - the_guy->pos.y); the_guy->direction.normalize (); the_guy->direction *= 5.0; the_guy->target = CL_Vector (SCM_INUM(arg_x_pos), SCM_INUM (arg_y_pos)); the_guy->target_callback = callback; //printf (" Target Pos: %f %f\n", the_guy->target.x, the_guy->target.y); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/Guy.hh Node-kind: file Node-action: change Text-content-length: 1891 Text-content-md5: a115c0a079a6d5d32ee031b25e64401d Content-length: 1891 // $Id: Guy.hh,v 1.4 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef GUY_HH #define GUY_HH #include #include "AdventObj.hh" #include "Clickable.hh" class Guy : public AdventObj, public Clickable { private: CL_Surface sur_left; CL_Surface sur_right; CL_Surface sur_front; CL_Surface sur_back; int counter; CL_Vector direction; CL_Vector pos; CL_Vector target; SCM target_callback; float delta; public: Guy (); ~Guy (); bool on_target (); void update (); void draw_world (); // Clickable bool on_mouse_click(const CL_Key &key); float priority () { return 0.5; } bool mouse_over (int, int) { return true; } float get_z_pos () { return pos.z; } bool is_at (int x, int y); std::string get_name () { return "Mogli"; } static void Guy::init_guile (); // Guile language bindings static SCM scm_set_pos (SCM arg_x_pos, SCM arg_y_pos); static SCM scm_set_direction (SCM angle); static SCM scm_set_target (SCM arg_x_pos, SCM arg_y_pos, SCM callback); }; extern Guy* the_guy; #endif /* EOF */ Node-path: trunk/prototype/INSTALL.binary Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1 Text-content-md5: 7215ee9c7d9dc229d2921a40e899ec5f Content-length: 11 PROPS-END Node-path: trunk/prototype/Inventory.cc Node-kind: file Node-action: change Text-content-length: 4937 Text-content-md5: 39a1df20cd83aa99912f810d7a65b846 Content-length: 4937 // $Id: Inventory.cc,v 1.5 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "Coin.hh" #include "AdventObjSmob.hh" #include "Inventory.hh" Inventory* inventory; Inventory::Inventory () : icon ("inventory", app.get_resource ()), icon_h ("inventory_h", app.get_resource ()) { visible = false; objects.resize (6 * 4); for (std::vector::iterator i = objects.begin (); i != objects.end (); ++i) { (*i) = NULL; } } void Inventory::add (AdventObj* obj) { for (std::vector::iterator i = objects.begin (); i != objects.end (); ++i) { if (*i == NULL) { *i = obj; break; } } } void Inventory::remove (AdventObj* obj) { //FIXME objects.remove (obj); } void Inventory::draw () { if (!visible) { icon.put_screen (10, 400); if (mouse_over (CL_Mouse::get_x (), CL_Mouse::get_y ())) icon_h.put_screen (10, 400); return; } int size = 80; CL_Display::fill_rect (size-10, size-10, 640-size+10, 480-size+10, 0.0, 0.0, 0.0, 0.5); int width = 6; int height = 4; int lst_size = objects.size (); for (int y = 0; y < height; ++y) for (int x = 0; x < width; ++x) { if (CL_Mouse::get_x () > x*size + size && CL_Mouse::get_x () < x*size + size + size && CL_Mouse::get_y () > y*size + size && CL_Mouse::get_y () < y*size + size + size) { CL_Display::fill_rect (x*size + 80, y*size + 80, x*size + size-1 + 80, y*size + size-1 + 80, 1.0, 1.0, 1.0, 0.8); } else { CL_Display::fill_rect (x*size + 80, y*size + 80, x*size + size-1 + 80, y*size + size-1 + 80, 1.0, 1.0, 1.0, 0.5); } int index = width * y + x; if (objects[index] != NULL) objects[index]->draw_inventory (x * size + size, y * size + size); } } void Inventory::update () { if (visible) { if (CL_Mouse::get_x () < 10 || CL_Mouse::get_x () > 630 || CL_Mouse::get_y () < 10 || CL_Mouse::get_y () > 470) visible = false; if (CL_Mouse::left_pressed () && !objects.empty ()) { if (CL_Mouse::get_x () > 80 && CL_Mouse::get_x () < 160) { std::cout << "CurrentObj: " << objects[0] << std::endl; coin->set_current_obj(objects[0]); visible = false; } else if (CL_Mouse::get_x () > 160 && CL_Mouse::get_x () < 240) { std::cout << "CurrentObj: " << objects[1] << std::endl; coin->set_current_obj(objects[1]); visible = false; } } } } void Inventory::init () { puts ("Registering Inventory functions..."); gh_new_procedure1_0 ("inventory:add", &Inventory::add); gh_new_procedure1_0 ("inventory:remove", &Inventory::remove); gh_new_procedure0_0 ("inventory:show", &Inventory::static_show); //gh_new_procedure0_0 ("inventory:hide", &Inventory::static_show); } void Inventory::show () { puts ("Inventory showing show..."); inventory->visible = true; } SCM Inventory::static_show () { inventory->show (); return SCM_UNSPECIFIED; } SCM Inventory::add (SCM obj) { puts ("Adding object to inventory"); SCM smob = gh_call1 (gh_lookup ("adv:bind"), obj); AdventObjP* advobj = reinterpret_cast(SCM_CDR (smob)); GuileAdventObj* guile_obj = dynamic_cast(advobj->obj); inventory->add (guile_obj); return SCM_UNSPECIFIED; } SCM Inventory::remove (SCM obj) { puts ("Removing object to inventory NOTIMPL"); return SCM_UNSPECIFIED; } bool Inventory::mouse_over (int x_pos, int y_pos) { if (visible) return true; else return x_pos > 10 && x_pos < 10 + int(icon.get_width ()) && y_pos > 400 && y_pos < 400 + (int) icon.get_height (); } bool Inventory::on_mouse_click (const CL_Key& key) { std::cout << "INVENTORY: GOT CLICK" << std::endl; if (key.id == 0) { std::cout << "Got click event..." << std::endl; show (); return true; } // We eat all clicks so we avoid confusion return true; } float Inventory::priority () { if (!visible) return 1.0f; else return 100.0f; } /* EOF */ Node-path: trunk/prototype/Inventory.hh Node-kind: file Node-action: change Text-content-length: 1918 Text-content-md5: 4e67cc7263dfbca6eefe280822bc5438 Content-length: 1918 // $Id: Inventory.hh,v 1.5 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef INVENTORY_HH #define INVENTORY_HH #include #include "AdventObj.hh" #include "Clickable.hh" class Inventory : public Clickable { private: std::vector objects; bool visible; CL_Surface icon; CL_Surface icon_h; public: Inventory (); virtual ~Inventory () {} void draw (); void update (); /// Show the inventory and allow the user to select or manipulate it void show (); bool is_visible () { return visible; } /// Add void add (AdventObj*); /// Remove void remove (AdventObj*); // ..:: Guile Specific Stuff ::.. static void init (); static SCM add (SCM obj); static SCM remove (SCM obj); static SCM static_show (); // Clickable // Ignore presses when the inventory is visible bool on_mouse_press (const CL_Key&) { return visible; } bool on_mouse_release (const CL_Key&) { return visible; } bool on_mouse_click (const CL_Key& key); float priority (); bool mouse_over (int, int); }; extern Inventory* inventory; #endif /* EOF */ Node-path: trunk/prototype/Makefile.am Node-kind: file Node-action: change Text-content-length: 685 Text-content-md5: 2936f52c81efc772f28aaea37267dadf Content-length: 685 bindir=$(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh \ Advent.hh Background.hh Font.hh Scenario.cc \ AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh \ AdventObj.hh Coin.hh GuileAdventObj.hh \ AdventObjSmob.cc CollisionMap.cc Inventory.cc \ AdventObjSmob.hh CollisionMap.hh Inventory.hh \ ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh helper.hh helper.cc \ ClickManager.cc ClickManager.hh Clickable.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr \ data/images/*.png data/images/*.jpg # EOF # Node-path: trunk/prototype/Makefile.in Node-kind: file Node-action: change Text-content-length: 12832 Text-content-md5: 89a9f653be67c059820885e63e2baecc Content-length: 12832 # Makefile.in generated automatically by automake 1.4 from Makefile.am # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ sbindir = @sbindir@ libexecdir = @libexecdir@ datadir = @datadir@ sysconfdir = @sysconfdir@ sharedstatedir = @sharedstatedir@ localstatedir = @localstatedir@ libdir = @libdir@ infodir = @infodir@ mandir = @mandir@ includedir = @includedir@ oldincludedir = /usr/include DESTDIR = pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . ACLOCAL = @ACLOCAL@ AUTOCONF = @AUTOCONF@ AUTOMAKE = @AUTOMAKE@ AUTOHEADER = @AUTOHEADER@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ transform = @program_transform_name@ NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : CC = @CC@ CXX = @CXX@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ bindir = $(prefix)/games bin_PROGRAMS = advent advent_SOURCES = Advent.cc Background.cc Font.cc Position.hh Advent.hh Background.hh Font.hh Scenario.cc AdventObj.cc Coin.cc GuileAdventObj.cc Scenario.hh AdventObj.hh Coin.hh GuileAdventObj.hh AdventObjSmob.cc CollisionMap.cc Inventory.cc AdventObjSmob.hh CollisionMap.hh Inventory.hh ScenarioSmob.hh ScenarioSmob.cc Dialog.hh Dialog.cc Guy.cc Guy.hh helper.hh helper.cc ClickManager.cc ClickManager.hh Clickable.hh # SUBDIRS = guile data EXTRA_DIST = guile/*.scm data/resources.scr data/images/*.png data/images/*.jpg ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = PROGRAMS = $(bin_PROGRAMS) DEFS = @DEFS@ -I. -I$(srcdir) -I. CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ advent_OBJECTS = Advent.o Background.o Font.o Scenario.o AdventObj.o \ Coin.o GuileAdventObj.o AdventObjSmob.o CollisionMap.o Inventory.o \ ScenarioSmob.o Dialog.o Guy.o helper.o ClickManager.o advent_LDADD = $(LDADD) advent_DEPENDENCIES = advent_LDFLAGS = CXXFLAGS = @CXXFLAGS@ CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS TODO acconfig.h aclocal.m4 config.h.in \ configure configure.in install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = gtar GZIP_ENV = --best DEP_FILES = .deps/Advent.P .deps/AdventObj.P .deps/AdventObjSmob.P \ .deps/Background.P .deps/ClickManager.P .deps/Coin.P \ .deps/CollisionMap.P .deps/Dialog.P .deps/Font.P .deps/GuileAdventObj.P \ .deps/Guy.P .deps/Inventory.P .deps/Scenario.P .deps/ScenarioSmob.P \ .deps/helper.P SOURCES = $(advent_SOURCES) OBJECTS = $(advent_OBJECTS) all: all-redirect .SUFFIXES: .SUFFIXES: .S .c .cc .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status $(ACLOCAL_M4): configure.in cd $(srcdir) && $(ACLOCAL) config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) config.h: stamp-h @if test ! -f $@; then \ rm -f stamp-h; \ $(MAKE) stamp-h; \ else :; fi stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES= CONFIG_HEADERS=config.h \ $(SHELL) ./config.status @echo timestamp > stamp-h 2> /dev/null $(srcdir)/config.h.in: $(srcdir)/stamp-h.in @if test ! -f $@; then \ rm -f $(srcdir)/stamp-h.in; \ $(MAKE) $(srcdir)/stamp-h.in; \ else :; fi $(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h cd $(top_srcdir) && $(AUTOHEADER) @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null mostlyclean-hdr: clean-hdr: distclean-hdr: -rm -f config.h maintainer-clean-hdr: mostlyclean-binPROGRAMS: clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) distclean-binPROGRAMS: maintainer-clean-binPROGRAMS: install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) list='$(bin_PROGRAMS)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ done .s.o: $(COMPILE) -c $< .S.o: $(COMPILE) -c $< mostlyclean-compile: -rm -f *.o core *.core clean-compile: distclean-compile: -rm -f *.tab.c maintainer-clean-compile: advent: $(advent_OBJECTS) $(advent_DEPENDENCIES) @rm -f advent $(CXXLINK) $(advent_LDFLAGS) $(advent_OBJECTS) $(advent_LDADD) $(LIBS) .cc.o: $(CXXCOMPILE) -c $< tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ here=`pwd` && cd $(srcdir) \ && mkid -f$$here/ID $$unique $(LISP) TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS)'; \ unique=`for i in $$list; do echo $$i; done | \ awk ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) mostlyclean-tags: clean-tags: distclean-tags: -rm -f TAGS ID maintainer-clean-tags: distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist -rm -rf $(distdir) GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz mkdir $(distdir)/=build mkdir $(distdir)/=inst dc_install_base=`cd $(distdir)/=inst && pwd`; \ cd $(distdir)/=build \ && ../configure --srcdir=.. --prefix=$$dc_install_base \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) dist -rm -rf $(distdir) @banner="$(distdir).tar.gz is ready for distribution"; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes" dist: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) dist-all: distdir -chmod -R a+r $(distdir) GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) -rm -rf $(distdir) distdir: $(DISTFILES) -rm -rf $(distdir) mkdir $(distdir) -chmod 777 $(distdir) here=`cd $(top_builddir) && pwd`; \ top_distdir=`cd $(distdir) && pwd`; \ distdir=`cd $(distdir) && pwd`; \ cd $(top_srcdir) \ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile $(mkinstalldirs) $(distdir)/data $(distdir)/data/images $(distdir)/guile @for file in $(DISTFILES); do \ d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$/$$file $(distdir)/$$file; \ else \ test -f $(distdir)/$$file \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) -include $(DEP_FILES) mostlyclean-depend: clean-depend: distclean-depend: -rm -rf .deps maintainer-clean-depend: %.o: %.c @echo '$(COMPILE) -c $<'; \ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.c @echo '$(LTCOMPILE) -c $<'; \ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp %.o: %.cc @echo '$(CXXCOMPILE) -c $<'; \ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp %.lo: %.cc @echo '$(LTCXXCOMPILE) -c $<'; \ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ < .deps/$(*F).pp > .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive install-exec-am: install-binPROGRAMS install-exec: install-exec-am install-data-am: install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am uninstall-am: uninstall-binPROGRAMS uninstall: uninstall-am all-am: Makefile $(PROGRAMS) config.h all-redirect: all-am install-strip: $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install installdirs: $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ mostlyclean-compile mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-tags \ clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ distclean-tags distclean-depend distclean-generic \ clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ maintainer-clean-compile maintainer-clean-tags \ maintainer-clean-depend maintainer-clean-generic \ distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." maintainer-clean: maintainer-clean-am -rm -f config.status .PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ mostlyclean-compile distclean-compile clean-compile \ maintainer-clean-compile tags mostlyclean-tags distclean-tags \ clean-tags maintainer-clean-tags distdir mostlyclean-depend \ distclean-depend clean-depend maintainer-clean-depend info-am info \ dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ install-exec-am install-exec install-data-am install-data install-am \ install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean # EOF # # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: Node-path: trunk/prototype/NAMESPACE Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 136 Text-content-md5: 750a8cea3d4d7a8d179a0d4c66815785 Content-length: 146 PROPS-END Every scheme function defined in C should be prefixed with a "c:" Every advent specific scheme function should be prefixed with "adv:" Node-path: trunk/prototype/Playfield.hh Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 990 Text-content-md5: ede09994af6d65a9501dd25a12d9af5a Content-length: 1000 PROPS-END // $Id: Playfield.hh,v 1.1 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef PLAYFIELD_HH #define PLAYFIELD_HH class Playfield { private: public: }; #endif /* EOF */ Node-path: trunk/prototype/README.binary Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 1 Text-content-md5: 7215ee9c7d9dc229d2921a40e899ec5f Content-length: 11 PROPS-END Node-path: trunk/prototype/Scenario.cc Node-kind: file Node-action: change Text-content-length: 2987 Text-content-md5: 018f0c0c422950c69aca88d758450dba Content-length: 2987 // $Id: Scenario.cc,v 1.9 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Advent.hh" #include "GuileAdventObj.hh" #include "Guy.hh" #include "Position.hh" #include "Scenario.hh" /// std::list Scenario::scenario_list; /// Scenario* Scenario::current; void Scenario::set_current_scenario (std::string name) { for (std::list::iterator i = scenario_list.begin (); i != scenario_list.end (); i++) { if ((*i)->get_name () == name) { set_current_scenario (*i); return; } } assert (false); } void Scenario::set_current_scenario (Scenario* scenario) { assert (scenario); current = scenario; } Scenario::Scenario (SCM name, std::string background, std::string colmap, std::list objects) { if (SCM_STRINGP (name)) this->name = SCM_CHARS (name); else scm_object = name; this->background = new Background (background); this->colmap = new CollisionMap (colmap); this->objects = objects; this->objects.push_back (the_guy); } Scenario::~Scenario () { } void Scenario::draw () { background->draw (); // CL_Display::clear_display (); objects.sort (AdventObj_less ()); for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->draw_world (); } } void Scenario::update () { for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { (*i)->update (); } background->update (); colmap->update (); } CollisionMap* Scenario::get_colmap () { return colmap; } AdventObj* Scenario::get_object (int x, int y) { //std::cout << "Objects: " << objects.size() << std::endl; AdventObj* obj = 0; for (std::list::iterator i = objects.begin (); i != objects.end (); i++) { if ((*i)->is_at (x, y)) obj = (*i); } return obj; } void Scenario::add (AdventObj* obj) { objects.push_back (obj); } void Scenario::remove (AdventObj* obj) { std::list::iterator obj_iter; obj_iter = find (objects.begin (), objects.end (), obj); if (obj_iter != objects.end ()) objects.erase (obj_iter); } /* EOF */ Node-path: trunk/prototype/ScenarioSmob.cc Node-kind: file Node-action: change Text-content-length: 3810 Text-content-md5: a64f8f4dc5c28b6acee7bd81c26d0aee Content-length: 3810 // $Id: ScenarioSmob.cc,v 1.12 2001/03/03 13:29:58 grumbel Exp $ // // Pingus - A free Lemmings clone // Copyright (C) 2000 Ingo Ruhnke // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "helper.hh" #include "Advent.hh" #include "GuileAdventObj.hh" #include "Scenario.hh" #include "AdventObjSmob.hh" #include "ScenarioSmob.hh" long ScenarioSmob::tag; struct ScenarioSmobStruct { int i; Scenario* scenario; }; void ScenarioSmob::init () { tag = scm_make_smob_type ("ScenarioSmob", // How is this used? sizeof (ScenarioSmobStruct)); scm_set_smob_mark (tag, ScenarioSmob::mark); scm_set_smob_free (tag, ScenarioSmob::free); scm_set_smob_print (tag, ScenarioSmob::print); gh_new_procedure4_0("c:scenario:make-bind", &ScenarioSmob::make_bind); gh_new_procedure1_0("c:scenario:set-current", &ScenarioSmob::set_current_scenario); gh_new_procedure1_0("c:scenario:remove", &ScenarioSmob::remove); } SCM ScenarioSmob::mark (SCM smob) { //std::cout << ">>ScenarioSmob: Marking...<<" << std::endl; // std::cout << "Marking: " << obj->get_name () << std::endl; return SCM_UNSPECIFIED; } scm_sizet ScenarioSmob::free (SCM smob) { //std::cout << ">>ScenarioSmob: Freeing...<<" << std::endl; return 0; } int ScenarioSmob::print (SCM image_smob, SCM port, scm_print_state *pstate) { //std::cout << ">>ScenarioSmob: Printing...<<" << std::endl; return 1; } SCM ScenarioSmob::make_bind (SCM scenario_name, SCM background_surface, SCM colmap_surface, SCM objects) { ScenarioSmobStruct* obj = (ScenarioSmobStruct*)scm_must_malloc (sizeof (ScenarioSmobStruct), "ScenarioSmobStruct"); std::list objs; while (objects != SCM_EOL) { //std::cout << "Adding object..." << std::endl; AdventObj* advobj = reinterpret_cast(SCM_CDAR (objects))->obj; //std::cout << "ScenarioSmob: adding object" << std::endl; //std::cout << "SCenarioSmob: ObjName: " << advobj->get_name () << std::endl; objs.push_back (advobj); objects = SCM_CDR (objects); } assert(SCM_STRINGP (background_surface)); assert(SCM_STRINGP (colmap_surface)); obj->scenario = new Scenario (scenario_name, SCM_CHARS (background_surface), SCM_CHARS (colmap_surface), objs); obj->i = 42; //std::cout << "Scenario Pointer: " << obj->scenario // << " " << obj->i << std::endl; Scenario::scenario_list.push_back (obj->scenario); Scenario::current = obj->scenario; // std::cout << "Returning new smob" << std::endl; SCM_RETURN_NEWSMOB (tag, obj); } SCM ScenarioSmob::set_current_scenario (SCM scenario_bind) { //char* str = SCM_CHARS (scenario_name); ScenarioSmobStruct* p = reinterpret_cast(SCM_CDR(scenario_bind)); //std::cout << "+++ Scenario Pointer: " << p->scenario // << " " << p->i << std::endl; Scenario::set_current_scenario (p->scenario); return SCM_UNSPECIFIED; } SCM ScenarioSmob::remove (SCM obj) { Scenario::current->remove (scm2AdventObj (obj)); return SCM_UNSPECIFIED; } /* EOF */ Node-path: trunk/prototype/data/images/.cvsignore Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 60 Text-content-md5: e699b7a455b0f16672d326b3d29bc0cf Content-length: 70 PROPS-END data/images/.nautilus-metafile.xml data/images/.thumbnails Node-path: trunk/prototype/data/images/bdoor_c.png Node-kind: file Node-action: add Prop-content-length: 10 Text-content-length: 112848 Text-content-md5: d4893e8e1a43b1dd2a23eca4867005fb Content-length: 112858 PROPS-END PNG  IHDRwΎgAMA abKGDr~k^Z pHYs  ~tIME .*kN IDATxٯ,y'̬̬}=뽷o/gZѐ,Y3@=А`E3Chfd@`?ЃCIIݤ{WeVᇬ/Wyryd:dddķo!Xj?22)%hV{S[߯\@ H)c1l@G rW~x?)%]iM=(9Y4y7ys5I@9MSAj0 Z1,T*躎zf>5ui"MSֻ8>?F̛}E$A ci8 Àij]\9a, e0 I뿫&_EnܮH !2b䋛exyеYkq>}$jκ_ 8""϶u _G>nH0MmömaY4 =yނ܊sFDWdΚ?zHF麮0c$IZm:mJ.'ɰ>`Uo#p4?yiLmasENYR\gu62爯KW?MSND`3BHpa`04MAu]V*Iu@z2X|n-;$ ÀJEgQgI5#f$?XK ʐEobq\A܆s24M=B=|EXBI(~CHǟ?IH)B$0R @TiתٜX8܆4"I!ȬhDI Il{q)[=tz npfY\ά(Rsk lFȲ mC(ThW8sIIb#(!K'NHxe*ێKl4n$p]A9SE'䒏>A'`T*Zd.֢l ʈL%lm Hh$g<+=ы$8t Uc[PX͟EZ1{g\`M$ 9E)mPuI2g͢+C2~d M.N=Wf@l6ճuIJeþ "́4| VUq%b*ct|sFP'bR97텼! ۻ@4Ee8欘k.JJDMtCNEijS}R$"͊Ms R-HD:r Z o\7`DLDtMRARQU7kDWD&Zd`ER'۶7WgzEXˆ$"s% !B5Mqu]W$AZE^W^`M`Yb\{$u] qZ8NN4I&Z$FNE1Αa1bxO$%;wa%{ $YhI-)J2մx2Qfm#RZkm]{\߿@*bRV(E%j5, L&dYq\.yvvvnjTWJ>MӧO10`-(됧n)~ۮŻ JEۮLyZX(g \p['b6kd+22) ?k\q6tm#ׂ=GQ,cdM&)Scf3ڸP\-(|1T2B[bP?݋,ڸOQ1U:!ĆgVgEX&ٮ^l#ĢVuC +J5+ֈ0R1O!JH8==ٳgh4x>|~uNihl87Jɓ'x)qvvh0 d,.Q3=@{m8ٍeCZ72(J2U6GJ^*$)9&x5-Ucyƾ{rvaߒeC4V?S*vww74.FgY(03|8??p8|>‡aUJ7|YBq@|L8Yq@”!^=1"'{moP)uMֿhpgzs՝B%]„~KϙrӧO[oA/Z|'''x \ȽkxEr: .NOOq||Ob8b:}ضnf ,^q'u 3M' 4Q!4 Ru}8ÍEx5KZOS,cDv!&@^Ws(6{MoůگjzJ. xwGa4a\*&l6vn/;pK,F!4B~#6-eYoh*v$IQ6Bmn K1 8,!}]_%\ERA*6jPVq}ٟo`4k_~m:1dY|tdbb{I K3H\V8_aH<]tݢ Kn/Jn_5.aBEArcߦroZs:ɓ'ַt4Mq}t]U,!AZUzFB|xd!IE]""% CD&3x jZN`cx@/j&out>Ƴg' c]rj)*24 io̴n#IvfS*~& f)!ILn؄/ Hl>tt6AٹTY4yծym< ]oM ^7tMQі;198!EOဢ@Nr<}B?ip]aZb0<4 JW6p=+h6*A-ha$cYyqY`:bah6 )\f}"eU$m*S.}{>^q'וY~_tM?2, <{ Ϟ=Ǐ)|GZEEx7Ắ"|ra2h\$ Z P-54MCB.vww!T}hhg8^Lf 8 4q3$IjkbSW[$޲ ߖq2B/sb|=W1'!ZmkAm4(pzzO?4 wA^izʇQMZ²,t]t:AgQq#& XhPWr Ag/sԫ @ATz8۶U["A>gF}7'zha4MH)7%2* u8::(<Z a`mtBqZ)}G$~^jҾau3pnTi4R兼z\~q8UFQ2HS[91 @èTPhh6Zh6ZB`8>d6FHT5Xkhm9q.kPܜWN#'bք󶞼6~OGAJW_}RJxvvvp'u̲Le<* :lV. LӬ0F GGG#'Šh |CQ Q;_p]Pm4 CaH7tf隃)R`LJ l%7.8VllGɓ'jj˲PVQTu2$I$Al$#P@Z}dYYۜYe1Q|~~~1 MC0`U4Mt=} ^o`,s\  `ҡ P AnlqeL^qSbT?A2m'x;( HŤ#7EeTUxbZ anc7iM*&hj_.'qGQHll|#fB@Fa;@FcHc"w!sBL,BjH VhttS(6Ov@$?˂<5ot:X,XVZ`Ph8oE'ֶmR7T@}]DZXRx CaYEu~gVZ5oQm lAʂ5n , \iޣ,~d2,1[L1[.A Ici2mvFkݞZ/HU4Mz6TֲJqžŲϺjĉB҇U,sq;jZXV4 RJI2TDLCp`m2`"HMYC1Jj}FN]t[=X Y&kZ je˅ΧpW.\ވ֑֓ Vn~Lqڀ(T]=X  gl/hj!-k Ԫ512˲n> Еd" Ozx;9lPBLZ`6~~ ~HӴn۶ uRFكd>Aj5HLJ˥"rk#yMaN8;D;@0U>(WQ$p筌8d&XJzLzFq<3<=@H՚ /pz.&1V Q!KSdrFGBR/ UvQ!A:d&Gqnw7Ks X."Z$ܢSًJ,q2bʾ x +v^JgggzRZZްmR%|#ȸ$ P'7(YpppVh#@NOn7ר5pw{=MI.KeQq]_Ya4"598B~k/mTy<Ոj(vWX4] |+U@RJ2Ee:#0д| a`U,BG-R@{x~uB#+B=-> }Vjl]h4v]ŝ8ܻF ]hNWc[pV˗`u0 >2ˮ#DBku ؖ)2!N#?\!N#|wm uoZ̐3Kk'ySmKFEo 9/B86.Zoܛ$Ǚk&4c|x7<mve5]_4ŝ;w`)21Zz4.5 UT캮oZ0^{wc ۲|s \ZkVZz'UQ%t݀UPkWkgʅ H)!4 Q Lx B7GlNSoVLvF^Cф]/W $ o!AvED+`\s \ rUt<봽n?UtoǴȰ9fYAܞ裏ok뚦}]Ja>VAAAUO(ڐdO! Zۑ A3P:.ʐwpg ͝kBT:DH}$+P{ovD<\G>"LnFQu1LTw7 IDAT{X|Vn$cc4 #Q???/[lHYڠ5@3*!NNN ǏConC#nuh\PƝ|1ӑ7Sw,Ke@<˥QkA\k)3 93LVN[TbUX 0soV\M%o!7Y\2ߋ^>/~FNM.&R%S=!w[c0(Prjp{G~Ĉ}߇x駟⣏>L_:󟹮+|W}䓗V}߿K Fu4Mh4`YV3nԊ⎖et]Wa*0 1lNZ 6Պ$'pVE_k@C7h)n$ NC`6O1G\';VJ.8Rӧ8y"i> "-%Ǎ?DY$b"$z~gؿ0 AQkiB4/iD$xU"|Ǐ>yT*i*.:x&I4>H4EtCss4|WLYu,KxvbfH3Fe' oel4M0 <;yg/EGI谭*:Z6:vmk)Tt"sompBў-6.JoV.hߊ_\*$'eڐӦE55I*XV899oi{Vm쬒$ vwwa6LD$L&t?ivJ\<խ8RQO((RJj5ܽ{zA 1޴ܸO\`W !<O g3"`Y6:n^Qol=Klem;h3.OI)Zd.E$>DtIy*:'0c+Y@͊]CAGCDծmE2;q۽>Kf Tg( lc"$AIuZIEK )U"ݛK|<|GԶ?máAtSʞ6jZ^ %ԳW(Ǵ(2m괩]f3F#[u8a`<c:q+mAZ;]4 $I9<>Kgb=KtvfVFJUH|E+um;Ju.w*Gvb\s")#ݟ_WK:nkҳq+BNp]xx >n1{ ϜiZ׶y\%G6϶o:~$&Lo(f<O>Çko/}}}0ldQ; 1)$BY2tJbZʉ⟴D\gV1ONRj)Δyww&1n[4M1s\A~ehV{>3 k¾=!"bٖv{v{;vz{Zt:p6g7m ۼܦ9sMZW٬W]z%}G(~s CD&1NΎ1KǑ"繶bT\NvZU@2 #9~(S,@yZ}OVyyl3eg~?O^e޽Zb.$Hb$$3KIXY /Z-KJÍpGEJjJM 9X~eAJ  x\dhaaaH"P7zj5t:8*2(ӧNxq= TH[K C'C+I߈rP,U^?["')o|NuVRn cl2em6'Up[*폐()!4MkQa:b\}ؓǯ}'NfY߿ S3(=h,R79iaO ÐwjnZ-ॗ^UK=o(YƧBҮV]J4,2R;4E^W5F3Ljmdl,p}Ν;[m#c[ ln6ʋ0(muX&[0gQiw1[RgJlemQռN->.3O1!t܋088??4Mag/{_>|Ez=u8\d i>TL~rAfIS$qi4hZ*ō*2:bggGLwr gr@䉮7HC ~!bDL*l Zʲ鴻h֛0n"QM}&m #\&%qҼɁ\.11U <ka<~7t=Z-ՖcXu]u   )DBTNjlI)E@Tj% !T6=d2RoNśfE fi[ !' 4UmAu] !$q)t]-X2I3N]%Y,2.٪?lCJ ;==rl63w ;;;bww;;;CSGI8rw.N&b5xiXV""2gH];""KS&%ݻZT٬Tl69FBe)fI^'BB 2dمs薄MhX@ mAŇ ctzh5W!U91E<쵘]M!mTjgM;MoyxMƒaxKoֿF?z:qTyΔjFm$㆞ò,"*4X.D|)n^[Drr u: C |߇eYhZh4V;(A E1F!g8n>414뚷D;| z5+T?GFz5٘yT(:ęu:p2&89;l1hwqjP&DMmU󇕀nzu];ynl h^f+(xpO9w17Ԯ08|ur[o]4ECGZEZUqCrp7c<ˆE[%Zb/,ȶd:*x'rl9lFVB|tl,\Fͤ"%D]E:BZwKUFGCGWgej6o& i "msL%MSEѨyAЭjh6H2i[RJ uWMP/Cn \{X,ˢ0 7tgPu TiS8Rnx6h2Dwc(py#n h֛ !B䝿o?^bhN.VqWO T1mUHhly}_]/Z9R +91awo$I+w?wrp KAtnnE&BI=ɛ4,(BR;CDD{qg%K{WZ?%0xq幘MFX:yO=ۀ֍+4x}mrDZ:vk[]v? rSL-^yOBR.&oe!7뺪 p8p8l_wo0`0Ph4T,ZB:,(y&IQݓ{ι'%H)gDSLֶ؇h}&C'#1OdΔy1+&j5DQ_Nv.viwaUu|uRhOc]T\ P#T)\IO>w!T**]L=SNQ+O&BO*JLb2\ZRkJ @1 Kyi#9FMX޲⾸7=f=uwyzI>h6Zw0­F؉?jjm${OHDp| n ZFZUj =σyFXV<{ǏiYj!Z-zzz1E}4BSK))ࡦiQ0DBYIj3 \kBqLRɖ$Mw[F2OKH yI"M5l`NRJ`m evuOV:5ϡ\ss \_JbJuϦT.BJj>Vy:8m[9P.fT.VǏhuea_JzTP*T**CK$+`!sJ¶b!y*w$iJz]-IjRݩ;Rk%/9S8d(ݕ+oڔ@bY6z^~!N'87ٞf;ݵF$IJ5XoRBMӴlZX$5PZhk\#!F$'!.INR%)?N/_r^?ԏZR"IcNx{J4 c#ӆdCQiNhmIM% OHb܎yWՍ G6|48H&CS'w==;*N)ܕsk,ώh`gv;?op "PYc(lI}}WD麮 FdR ZzIJT.D)gx<ɉѣu]R~9 Cj@uoyԪƜx+D`D"g O'm!z gYv\^rHkřyF*(9\SB0/ݹ^F3a!e?iZ贻8ܿݝ}TR=%%$AARMӂ8bb83dt \}"J"(E$<{86]-M0>ia6vww:rٶNJ` PCRTIR5|bΎz۶S!0uåMPS+zA=T*pGIpOb4>.`^эZ}tet>89?hrd\'L)nh78;Tjk7ȲL r]Ws]7J$ "H:v1D'oTQ@y^m%%rf 6t>dYin5"z^{awww&47 ԑlP*$TR13 h4vf3˲Rh B㐦b.<B:̓rqTe8rFqph#h4ý;װg蓼)b'juqvh:,뀤> 8 u 3qQL)tn@ Cb$pᙥf X,^ۚU:.z\$b*9^с J \t&.WS'm]nEiǒ IzCDM#,<bs//Ij@ًͧqϲY6wŠ}9#<, C8X,r|r N^vGBYIsH$Gh"Ŏbtx<do<yuJe\NSh@9=H=DSi^|n8"&rDm<}T&GjURx'%&DS bB4 FĠ@9pܕ#8~!uO҃C=/E{hrY6rOS1L:}ܿ `O ;ն9vIXWhYiArseј|t'I"b2}˲ AH4!$'鐭[RsLS1^Fq_Svvvp}E^m4pJ75\fF׼11!{*@Dsxx'O(B2 `DZP9b PS%zˡ|jL IDAT=„N|/K_T$UjW pw_/C Q"B Zvp%죢90lqm2!h8ܻW^z {贻0+/6PE՘K/س lz V0 5!Dfff۶$Ҭ(mAㆵZm(Ȧ$nO RCɶ#Fy9|zowQ6& ĩ-ӂmUa69V]ݩV8<E@EeRBd[J-W\b<ڶ4K[ڐmKy(R)fG)f$H%"R%""۔2qrhWJ:i! cI j?vzrq]G1O0yg cZ`QAhH!'F\tY™d$>̅1] nH^BDР H7N A5Xf~`_ru2EO(-*Ӌj*pG}_mۨVzz^jR0T%Օ{mA;?MSm޸n-ybZed 򒃆rRIt]w}y^}UGSZ/Ip֢*"F)jwA"c% *˲n?ضZ|1_"dϨᒕ<p{> Cc<{ F&€n\"H5䝠@fH2+xN){Ȇa19.L˄BtS. hf2-޻= `&?ؐŌ2E YZGǘb8rYe%njV~?mZ a9qg@J&PTg}- C-˲lC"FTUՔ~eXt:b|7ZpIY(IBn ˝d@#b"x饗#EIYi\wǙgNG%q.ryԐ WP0B̽+RJ4Ne,NasQh}NuPַ녨&LJDEF+YrxJBSW놼*eAҞ1Zl yEQlv8UX.ַo~w4MT( Dfi. v\\m@ B:3AܭR(ݙ{$=YiS(KIK@GRS2b2'\'(9e(/_PV7TZ5!b\V#H&Sȁ-dP"ݓ3ER(ovXx<~/}%|<<q3b\QCEsj1eיyKl{UYժ&٤MPeȞI6g<ˆY ck柁 lX,BP(i "uMVTU#"c_{#w ՝޽lι,`4ϏlhZn&$`:U=Φ#{k[oٟ۽{}{-D{[qT0X6sT9i<[TZ+ s 90 fV*xr0^RExtdJ%gxZlIXt-Նe!ގЌE4JDQQ)4KW<|) qh? ڣIYx?HJҥ*=zN]E[[[FL *aLځX݋8(0B `0p9h4Z CvNNNn͛?vիpʕ6D#,nv;%`\.xU&DP;IOvrrG{GMG(9<<U;p 9)p_I)$ IvQٝ;w,`0p1$f.zꫯݕ/_/| y sdƤlF$v t#hĴnfC3>l#c Pgjbtt*}e,.JfԄf@MR5f1`qyn=D:Zz.΃~ٙ5oߜN˗/g1']#8AQ1b}jHNYX.A繾Rt=j=B2a^ 0d&ܕ33[\.[EvrrcZU'S]|nvxx Ig?kټVCkZmllٙ]v~~NOOm<u, Q[*LԜ&It#1PED(߆'&O!BӁ| 9.!㝌1DofVլRY߷BTH{:|vl6lo2N jd2h4\ 1Qxzzx~ݻ0/^rF| p81XfH `F*VGsp9h c\\sb$_ fq#7;w\uaǏnZR_|yR^`BUk |T0JUa"j!LZ# ' LFkkkfJ-h4Z=LSdT>op8#?6H T2n*ɉx?^?s||3l|3{O(:¾y*;-}0#WUOSSCF k0~F#=@_PlVvܞiff*8H i-߁,%ph|/RSnd20UYGʊ7ϽtsY 0D3EՏb{ƈԋ{. DD#0Y!g! +PGv` Db\uT*6݅jjeHPxɓ'˿˟t:?^՞?_^R JDtV.[stF=i Q 2 ݌wp,mG;<<^x[ޜcXџ8]SA^[ǶT91P$%0qWb,]U#PL&5h!%!m}߷nkӣS27]O>'Ofv?|^}՟ںO~2)2#%^<; " 'ht hM5S=qM8\ӑ@K)<jz4v==/8ׯ_w1 CT*NCJk1,n?y͗{w$]ԧ>i4ΨRKZnZW1nj@m8 ө2bH":!T<PӦϴ8840PN =fw?z*٭^)ły$((aaX,Eɚ2}\S*r6uq˫|ww츳:#}0t?&at\j|̑ a pHҀ(U[__wwkD999qy䢀Fz+?5'OJ׋~ѰjT6 Ƨ;HG\dGsEtG0@Sm'a\eXi༘y3لq0$I]3Q_7V:\.gJeSx{}|($ZT8H' 9R(ʠ!ȏ+"V Krmllښu(}W":N;$E.Z`&2JkN9ú8o6;n^yB)d¨٬u]7 s6-9f`NY4Oi!;N|\XkƂ#8^"CD E0=Nx Cmn1&4`ț @'IbNl6 H^ R) Y;4i-Nnm 4QX»)DƵ5WPj~y@)B)'"7gI.ʞL BR^zӏz~+W=zksҥKATq>@sc=Pte֩gj:7(%Pf4WZ5Q7;eg8m29:[E/ $I2('p6 'cJd}f2 $&?c$ss4;ρ:ty.J{hذ gj5ұ[$M)lhN,LdEޖ  ҡ80tie^OAN":Ej{kMHFgƈRbaC1MzʌzՏ3I\i<7Kf; `ׇy^ftlkk#? Q~"[`=MQ-!_#/<]gVV~дC]WUltMcWc@El6< X?[C"Nqd2 'IAEd`m2XqjI'*\Ou&=)|z5V J8xDW{(0u$b!FGa[YY(6͵_Lt:]}߾2Nj|DIv4%T1BLjjHBѐ@ddF\qISPfR3smYa-c濉\48NpmQ#ꓶީ,+w L&NW`LPۢT(LYuP$8;0P>%~*ifRAtDMDnj7f8sCu]uqqwrrbGGG^N&\.\.w=3QYtΝݻ$I< ߤ!qFszva16\pW%%9@TZĴt|$^T"`D+lB>zW' #kykOU*SriJn Г@0L&x@vm~rPFQmӐ-Z2{GӧeM\; ӁSq}:ZàAs*l`(YѰVM&hd8 W]ptl{{^ݶ~ۚͦ3@Zj5FD "oK~4=2p|-73I("0l:D

ͬ<ZS!<[S+ 03Meʹ qB}߷Ved2q832)-[0aqA 2(zLBgj} ǿCTx|WsF qkKJn!TY0HųC0hN%hdyf'O\wB;;;Ю_nWrFxZe]79m@;%1RֵOĝY,4?Mf<U2ռ#Jk:TE)]E;uBKiETX5faR ަƌGGE&"j,;y&ddB8{ڗ-X<cD!& h8wEf@ԟNzA޽{vmosm.{5MM(;$>`Ð$Ad<\D<JqPBJ+u@ɕp<KS$` )%)i\9 L E{oA|.WP+N<A`.]r7|>C}NNNǠi7QԈmMfY%QavG[Ŏo(^AJzY@Ɖ n T׺h4/u:Ν;;wdr~4KM WTFaf盉+R4` 댃IVڃvԹ/K#Cpo IoZvf~mmmNOO;'jT*~iw %f,m`H-TXݼgPgFt'CGo,Ԁ>yh/a\Z+oPIknҥKN4B+ۮrY ckV.ѣG˘$beH0t穨4`)FS/ L.I3,*Y/6} fEˣòʰ"dޅ#l(zRG;At~~ӧOQSիe8X+rrrEQئhG k5?bledYWR`v~c&YqIYfϘaRemfaa{"; k,ü6Pv횽;J%znժsR\\@p؞>}j~ߕΎdP~ ן+mLQ@D3mWGIx1$}:PY2<;H,Bhȇ9f3z^ [o~͜Y6 V´u}qD9- 1uY 8^jל3(N (%F4%tƉ2Ʃ%%YfgidZke.]X|k#7eXr](Ag3sggg6VƆӽ\.gzݮ]f׮]h0qKj0 Z=zgब fDΘӉFYO Al1-v߻{n7\ќ(qӢ6 A.xrޥ,$"!9 FKw$QrHjCN(T8 kn&S)](p\a M6H-ͺ#2Y rm+v33syg'\Z5Knŀ霓 ! >blxFRso5DYIB1(oWДZҜUjM^m+ˍ7~i2'PRkc;ED?5G/M0W16^pmf?хj)DjM_xg]1cƺOtA Н!Ys%41*z0sU'yT^@O5 ,]3sgv0":NB@8h &YI4ujU"D^sC6Je +m:0-gs\nS,믿nw~QSvu䭭s6Um44|+S\>mi(& OVTP詔?cG@7l08hX4ϭjV&I?^tiaai6{CYkΧ@D9 K}4d|PjH8T 5ԲHAHuf {׬PI!^ 9 *kN^砼Xy=B5Ij@>s b z*,l6sܼ',Jbj~3i0u.YɁB93'_J h2n=qL&Ç`~"wD+~%NTmۮAK~YKiQTǫIἒ<ӌc؛JF; Wjm4"H?ο^۳>k??oёݸqnܸaj5s G*B$,{flءɀt~O<ތ1:u<Y\h4ʎF/M&SpNlPhDD;::ru15!%" QL5GJa ̉iǹ(bm 4ٙ}%2kh` ^Xtg{J Ɔ /ƻVVVPtQ8$$i7SA=]{677]9Ν;G xboL\C03NlY(0/Zޫ Xa"EW%B 5Gmۅdz=D(l3NNf^hH v(85^' ݚG[XccZ[s5}Q\!5 8" gqҦtȎ|4Y kf<=$IbJSX, Ø̐ :n0|ﭷrABc}Y+կySXH,rjoj,$yڌIUީq;ĵC(Jy_(l6`DSnvg,K0*5?,"kAAJ^)kQ";NDN l8gb<ʞf .Ȯ=5!hyI# #5!z{0<3K $ YY#h4uw.j^T!! 1FK2p`8@R HƸX8'$() *\Ғ^6KcAi VVt:=l7N^kL$KH́F2YߋLA>(2|jP)tEU !ph-U!oEX81RiONYOqAтMpFUI3sDk0XdaqK[ "C! ʿO"gT/0qá{-\㠫yOb%~x?GY~pEC)p l6h4M$d2^^w82Ox|>#{4?8⡐J PnsNϯ*rrFPC4Ù(~_\jsvv"&kDJڙ]t6neWEQNdê{Ȏh}pr|ӱfcYxgfӪժP=d%QVNEboduhTHR^_R:qxwݽrtt= yJŪժ; ז/H y2Ր5]@adD z)QAn=:#a>EdrdJƃQ1gdA``Je) Q,<`|kt}?VI ЈQ-[术z)~)M5`B,PA!ҏyK/qu4^Rت^œ$Iۡ}w믿ne3f2Dvؠ67`iF$uÇ0gCn$g3[:N#{\:huCq^{DZcU.[^"(֋uBԉjy+x>6x\mYu :q5kGbxa2|@^6 KՀxxdAH=ܼygOlf Гy p0k-;ƨceKkg%鍸<[(\dԣ"D>3&M*3@T*ф Bwq׻n2B&ZT܅0frroQF(ǑxNc\ J XhQRsu0 ";~<eӢܕhDz5͍[no}Rө@r=9I,QP(1A8::d2KUTNNG]#iZ.mkkmoou#(' z3)qkkkKSąBkA5@5?/^@s8NS["8 ȫVeZ͢]@n  ^8إRm+҉3y5HͿq=|t#% 3JhdTX }]xFeR3Ne[?~_Fbq89\CoRS&:rrQԾT" ?iZ-wy# WlkkE!nư8uvv孮HQ Fs5dJ !zw*|5Ew sr!ph4ciPsQƂL>' CEI|輠əhQ$ЈoÔڣ5KSA[(wg2y/g2`{{yt}CɻqlEMrp\ζ4w,n'N|gy֖ 3L#n5P3G7?~¥$C8N\ ڗkfn6d,%J?hȊwaydPp& ?C|]0VCk|x"aҜ pE !*$(B . {iMR':>>.>|wiyҭTZb gZXkHtqjB4Pl pzms^|vvv/1x2 ʩt^,]BHKgYr8f` 2wC넔80,wH *n*Z^UxڴyVO`熶1F_(hv!K 4Rmx]Y,r mseYXYlfyʢah4fz޽{8X,իWmccÕ zfA0Db|>. <y*2Q)I~[sիWV-p<('ā ;Bh()(ysJuiXѯP(4|MW;4ԆUggg}lll#t9iU1qv2{(,Sȡch?_E1"x읝f}{}qZƆ;Hf IDATJw@t{|10Ё*ȴdqhM۪0H`0pn\Fa@<lVP"-(5g1VϯtU\v;oW\lC̬r}w{{WkIF9#x֘)UahA(svz#OђwYR wʁYz=;::rpF%s52-/}ZƬ3c!tӱԉ+S  `8y-FzŚP c}9p+f 1cW*[[[[(, MOejnKQUy!pgY OSo:^vW_{5;<< l}}uA@%MC-"'#9-J2ͬT*965ZXu]s1-7ϻًv7rH‰ ?e_!H=(Zi$KS;NNđȉjN&roP8,^W d2ldl}}CO\vW.LSk66-˹$ ԔЋ: cþD5AVFMϙRC,l[J5adz=}f̋=Ӛ v0-ࠍBN>ʯ3 CNV.[s%DB^%n̖FEi$Ui}XUqC>CZ `<p\jhU*\.w1?I33< T+JҗlfRVOާh QI@Y__7\Uk j~qM5yzZD4A;`[.sR`@D]%pwaxt8Ÿ~-q s+'Й13WZA֋+kA*ccZ_^ Ly!yg9*[I JiWzȦP( WWWc[/v(Pj62f>75_{%ql.rl Lty9)8EќS'nի͛7m2ȳZV Rhu$R+LѣGvu;::̀sxW-(rO>J8 "=GvUewD K#p8~Fڱ إ 8j<~\Ƀ̸q*R%|O 3cK5hƧ:;^ G@ħPMYDL-c` j\0a2@Y '''ӧO|;?v Å*4ω@:?´9(ѓ'OҥKl6J(?Pb%+(:MS樤$~CW Br֮'pTKBjD.N&r?fQwDyof+qz\" rAOlSZ6 iZUږ&^R#H^#d XxbSkQ( ʮGG $ B|:=? l;xZRq0z8C_ʛ]j7R(-;B@PZXGᲯR7V_c@p]ʎ^(ԡ F1E#Ie5Z~]5T1qn<aee%"HMț#kqܘfwƆmGa;UL(z]e}A8,n!2_g7;P"4ʘz( nܸ1 ؇7͂8{ yG>4' :Y=(zTeD`(^G!F֌Em<[ ܹ{e]~f[D"U7&Əcʬjj:C!lWkov ET&? ljrrr:==b`:.!ge~DK4 PjH0 :KWx !,~G-^B$2h4ݿ߮\y~Zڕ+W,IYqev4 Jbqpr5ͥy 5Y懲0OHd&I3x7k6I@KdXD o͙0t[0 ںÁ kQ8M|<2p'flR&3r<}葻}ggǂ pE3svEH1B{`5i֮-FH U2< JKV!DK2ɹ._޽{mee%7d0\zl>??Wf}}8< xFyzpU)SpFID j.\NAdEZimf3Wjfr(t 3sl r@UW 9 stO#:l" FBּI%z 2rs&= =-ng5 pakiNI0 c^<&MHB RNI2j݌YPe 1V?C{%Iܸq?w?rׯ|P(XVznkkk ș+ƣ B=6@PzH#݆ƚ!C!5Q(HuFnǐI35MPVƐc.ժCW7#Ȁ=q|~ c` 5B*9D^̭S*$I˗ԵCvk 2v3sbWǫ14 BaXBa'ȄE"H(te4?Ўoj6sZ->s=\na3#XigC[c<&3[a=7e5RhBc$D#0/D4tOBr  ۜng Cf&s~ڸȥՁam5Mϊ$r͑5=kZ?.OUq}T'fg h^w ;'ThJv(|+s$x~,p j~0؇~hn~3ϔwvvBEwj`8ʡu+D.J!y]Moc\^:-8WԚ*]BbM+.Lւ)\h4\ sSXLjD'"&֖ܜuff˝68M?}?2[2M/m|6C*Z-k4Kΐ1L\N.!MC!QVM.Bg:WN׏\cݶoݺu˿u/fz4W7-JVլT*N5)F3ƥĈ:- Y39\ /`gggvtt#@̥B5dQTl$2R4@.pMuBI%?$K;l{ee]`CvWBSezF4RdXɨ:kPqۋ^C1&3;kAp#V*ƈ[/΋-0 >bOOm0nQ,>MP. QQ)DGYذuB'Y ʭ (^V=ȯ(=p8D企;[Zu&Z6Z`/c2 d~IԒMk9p8\:jBF)j AQy)nJb[rl;z^[.SNԃ?y #$I\K3XjA,m%R(( `wk k6Lloo/888RDZuwx< M'I(@JQ;Y'6sB6䯆+6 G'u:;{!€Uا4z+ 䅤ǹtg39~RkL 8h{}~Oj^ӥ,-ZOj"Bkn7-\$KSNjM&;::;ΏnmmFq9DeNJX*EjZzyx:G8vO&t钍FAvf5/KU"i6- VF  W C`@?o|{pP( J;h ^Mcw2D+zwg3cX\0%,ƬrtG vB8==zny*k>Y$x:'/Ny葝۷㺽팚(j~?~J ƔR7 0&( D!` B[-@x0 m{{Çn;`FC b?)h5a&_XӒl8r U``/шg3p>LaZ9 ZPIH}:zGywa8h?f挕*悐䕇,0ZgcRxWr!ҩ޺uˆá[\zˆáO%h77|>=۪Vhm38h ֔*IҺMz. A}f*ͧzh4RBQ䁳I e*R5M-{ț|0`qNbQD2=@iE"t SA'nE }Z#k33g';jsss6XWT0P la %tbK9 9ʚ3/6ɀ4+٧u  .N.υ[Cf!z5\<`Ntyc>|#!Q!?!]3,D6d Zc"f!EA  :}k_]+JnŢmnnS?Sj^gg(Z/AAlv=\ !YkuF`*͢M(1^Ose"-uY>%sJ)k\,hX\^S"އ0u48J-k)GY>P\Py=TmXhf2[]]u9.Zt0g=$9cj-)QgX|>O=y{31(xf>)vՃ(#IAx0i?N^jǮeGGGvpp`F>{7^{~8tl6]DNjKWZk>Y3smKN-8P&1l:cZ[Ey#ь<@eR)Wf -_R# Z>BSQk*|Պ!M&l6@Iè#|9}w4VTҤZE#պJcТ= (AAo6_#?#6_n=r[(fðE(EAZtv:M4TeDQTW%f3GAk>R*\D;eplAq3ޒ30 ]s"5Bhp+혔uK - 81 D ONNiQ,D|m SC49i7\.7\[tGFo:؆Zi@nf"t:] Q4WcxD 1+bN+Fv$HC~d>>.tV.W&_ދ2&Dfn뼶FEEyVm:]t b^K0v.X Q BfEnZ:01q+|#7vPL Y528=ZQŖ=}鏌0LJNɌKکΎX*\ʊ z/(.jPO~~?~l\666l}}}ibղ^x/[^׫O +JFw*{d'D)\,;N[Ádlߑ-0k纡[k^xvE4jQjHCr5KojD% &8Y }YQ-ɋO-B:>FT&irl ;Rtv2RdjcQyz=QNѨb(Nf] $w}J%v5 ;::r9-XJX~f."9c xdB3?=O!q}ݻwo!%l~ȋm:B#?}hX+*c ;-FQvP' DA tjf.Loc0, v, 4J4zHkPilD0B l6{nPlԄ 4yBo׿uF}ξ/{キ{iy<jXggg;^׳+WN˒3h)q7 OQyJ_ͦm;<<K8 o2%d0 Ԇl"`N#4QVK5Ncq86tǚ*D (K#2#rSM Pt5nTYS1I",l Ţ]|?rWT$?bZUlvi OEd~7~/}vwwlSpV0 kbцáψRZzLK1 uO$FtKSd#wV1 rt;2N(EiPjmhZ'Όs~Ζ̖ Q!ۊh&zpLoegf8k$+@ +WM&k6vmGΰٴ[tڒK]xGB(e=D|֐d1EY;)9f96L*ќU#-FKۗeYg 2^MXJ(I3s IDAT2jp@{:bhKƲ89f# (=jrBz K7D[eQΎ}K_7op8t r#_K"Zٙ#i(?E1:X1HǃMԂޞsj.jpfgzjykvaz=.FD1 tq$C{!B~B800j%YjۚvhS_eM%R)BA3S%0@mpH[3A\ 7طN1?R }B [n-ZHPK ޚ$6ߵ7nXZ__]۳wfg^k׮j6Q]y%Ix%,pD DLZqDrv#*`>j=y1q|qЋN]iP1L&[ZuQL Tq =ϗ.]r 08/5BA0tA:M"3g2F-g}ܞY CVCw!ԨxNR#afO<ϛ< r^> ZflZs`78H^$IPP,˕vN`/}[߲7|Ӆe(BTUAÃĸY4!)Ky ښfTio"Ʈ^(bw޵Vl6Xxi^s p5zKR#&!l2%r>`8DFTHb`z"#΋άNZ #cݐE/`jJ 8d2h@YWjy CM]o9*$s C}Ϋ2 ef3+ 67ް``׮]rlV(\r/AQ]revݮ+9q((bcc677!/xA1?txxhgV(lssm}hT*6T5C{WVVԆáW^5:)t9g| pSk׏PZ<9Ƅ#!)+D.D.Ɓ pN<[Vp4=jqL8z;LVWWm2Xr8ȉ 8=R:L|tƒ$qG+cΝ;l6]3xZ &|~o<81беBDΠdxWM\Dimk|hܾ/ڽ{\3d2q{ $N8G|y]3A(Z6#Q6e1-2Xus8XCkhfTjl<[TVe+++ّɂ pPŀg:CPH5Qڣ%ƤS(w\lcJaL9=g 7,nlmcccApNpfZƒ4l(oUX (6(Gl6DZ~ۍ}婲Yܞ$ hBE3s,%lhXt{D|n8-D .흤 fQGLsek4K*`;c W38' ʾ;@/vf ulMD+f-yCn+A~qBYuW6fOa‹R48%fq 0MTu$1IE7N6Q ʦ\^Ɔ"P"xЮlZEkxFR!Fш0YӱVe6N5Yjuuծ_nW^j`_\c)%' HCCEqI71]'M #΀Jz>|<ϋP<©$FQfm@) ?`šITr ( SGimHhmbđ9gggv}sj"z--05X5D!j%4z),2_^8Ct5|V$)xW (2!&ЄY :Z` 'W(s0 |1li_$PEN } Xicb^6N]XjEsg8y̛ͦs\b5}ٚh4\^5 [__W;e6:E  N#2?`/pX{Ƣ qh}9k)c ٵ f3&cCi9"@<3Ðg2ѡ40pᩉ0_E}[ rO]w,J8~vhk6."( ";(xrL)uQە0Fa(57+c p'ppCE9.(Өsb8%,:<Ǯ%WI iC|G^[Y8䴌G I-t<y1) ^6LҩafKz;u:5*c{ۑ l.㤭IR@=gA?oRpNCF S=<rLi<Ϛͦ#c666}1ǼU%"bD*."!JU.:Fd"/`QB q4-5KڕpQjKewI`Q\"ޭut)u;f6Od*oAK%Xϖ0u T4)wlf(!Qw$jO&;8{キ;G9!Plvtَ$q="ʭ!%" B @Ϣ:K] P$ܧEޫkɥ*X\d~V$Pws[~܃<܂WCbB4\Veo޼ݝՕ:? OaQ)+Pt0 = zοRuso59- `)zʲ,u]~mC:i^qnؑSIJo,PeB~ثW0hreĴZ~[U՟ʲ\eɠ9E ~ܺRJeT9ql2/ёՔnnn4)8_gAiVBdBAsfubkVVHVOg+ QDBAq(Z()5ȵYk~B`ۉ|IQt6q [ւpUU%ph~޿H䔇nrR6(Vf??7l6s%8-ZlA|&2EQ˲<È0N`N*>>uI@wV1ǸQ8v}}mfooPv 1l†y1RTPPuN)c2R Q=>EAHfO!\ph K:iOJ`0,5 <ϳ, ,a΋/,d琇]J WUի뺝Orkpr/Kok?˗n6m8~3˲̮f,Kʗy: <$yukpӦbӼ=㡌|zzNc?엿]__cf}:==Ҿ+giChtQpC lԼzF%%,1),?Q!:y9F-jt̙::a"HC :!@VZeY֦@9Pej",|ÂSwi!ʲ˲\>|nk>fc?իWVvYϟ?\a4Sؿ<ϓ6`mz||8"1!rZK)}i-c|,NϴZy`Yc|:V4RJv A>iz&ޥ@Ydh$Br^P=bqp@z!e1/0(vuupNOOr?G@>o+0.%QyaڹԄsMLZ7)nȑ1+7c$^j!\`uJז7!ZMBn) sy =فս^;^b@޺fOOi(Xs<7o'?޺yngggn?`|߶3/_t>wSqVsM K^Cq)q(!J2^THo\|>?`PhdN="wpnxv׍2F H HܟjУ4x9VbE"<9Z3Ш3"2K`{M&1#yGʂn{Qʾ2zEn|XدkNN#hdWWW۴#l<'|O ƒZ0utd ըA!r$ %Wl/8 UX?D uFM "c`Z$ㅛ%*d$9-1reNmZ$Py]شm<ɉ}?v0XQȞ={f0X]^ntot(䠛C15)$j+kў9nM5:̌GI^g!)amy!_ "(kvxu"9'7gg)\ g Qt8 -QkȭY):0mX}xh@OXW^Ł1ÜCه5ϲ̎ڝNgc,VUqW- ꫯ|w( ž HJ1eYTU*`WAeŠF4D!0A]P<+W,"F-UZ[4'4̜lzv(2PЈ$ s (Mb"vq k!k"Oz:3Ԋqp$Q C4È;񱺻;.&}֣ʺjyHHuۅyՕ?:v[s驕e[cХ67kAxL]硪*=yaӯAġ!r c`ø&Pj˲m~~~};߱,m>r-|8xd<\0&!\J+Tu(U#H] nvP^͕P֐hR' pd$]8hkQ B0(I6|W ލ#S 4b B09(,%:chjl Yٮ[+X͞rE*Gݎ@l& o 9,:c|Zź hZu9P׵Gw}\!@%2c{c{]U׻I)mspp8+;==u,[8ڈl<G`紒i]I0([) θ3c D]A q|H)p;QNxV5юsІg`c3j)S^__;9( I$$UdžhwԳ\ V ԥ5jGP eI))#)NNN,J)yhev]53?I(B><]Z(/BvѢi؁ [;pp_%vu6񱟍B`Lz.2fgx1.ƧS8FQа)Nc."B3}4Ui{N<#PRu<kOS?u62h>;nfX r^ CNppu]u]A\pj s Xp|yt:xN'i&LvxhJ̠x1t\IBb_Ev̫2h7 Ru]{4U2Iw`! !MZ\'(:XQ2A$sYՌn!#"\G!nFen@ .:"8./Z1eYV_DE֠YFX,\ʶs"*k͸hx#Zc,nrcXG.ӄ4tճ0BJ+宑k}jU\ƚeO#!2<<<ԭFҰ,0q(ʮt||P$jp6:"S&:EQ* aQ@tw蓞)"1yqu]/˲\ U߷g^Pٴ Wl͡Z]^^+jn ϋ 5*hUU9!Â)Q K)wáeY'iQ̞jIcT<^-QX-!8(**@^ꐪrXTH^A0Fd)>99[N 23wrKQF7y!{7*;::hwxle PW9| :Ƙ`g̬V+!$/"@AmBJO9īqRo(FAB[#zYDgXPN Lz=I#cq8~C=Yl/x(ШÃF#o"V2DeR#C)FÈeA\_vQAƅ܈Uekui"?A#y<\" :0`co<m{ܷ[Ȁ!n?fyzm#gaYCfz\KOK6=#b{+5a&|.=Jüooo#( n2@sͯBlrRg@%R0D-z|I/ugxxUu.uHjz+k%@^=AܯO,+1>"$0BJ)ah̅yx~͍߻EQ777ZBRꅘhxkU UHeY',vhީOօNjh #C(vŵk=ȡ[)B&aZOTﭿɻ+R 2l1"z0%kiQ:v{X4Sz2^6tH RdM|u&UC #? p޼2xnRdi~}{~fUWJɻB~60,S~~~xj !hR~rp:u]?+eZ2 FFE3DeɉB7($8`='QCk}ZWծ-!1F?\`N=jn׷̱ _3/%&XEQm+QGIupp @otF6B0}d\13x<U81'u"YhAFVOH'25R6Ak=?cD1Te}l:HY( fvAVIuSeß0KC*Pf60mٙ\wj1wfvlfL:ʹDB˩'q mP\0&]eT}# Dāo P(˲t#׾Ty0WûaXxSkk5#tQ3vy5Jp48M6sx}Q5Rj:3+,="+Q] ,oSkvt- AC#n~o6=qGAr<ҽiAz̳,c]ןv;"?*'P!A`X0È1:'A D"Q l<L'?|Kz@")|d6fR;fz,<y p8-9uA9o⾌M#T`ˇ!0֘)XT{ad\k}#pnɜ!͈Р֣=8[N`rcL&~,Ջ~o9jӯwx7տկl:d26A&e6MQU"4M)M˲|Ln 0 O!"0B 9L#ޔ밠|1@H͋HcDOjIF8Brv1NF`z5a"dC犜YoJa+8 :cȋYkEhY]#A@TliZus'<Ö?E$x<,믿]]]__9V!7MnuQ`XfSl2pE*h Z/D@Z/Rm1ȑ,0JDh qżÕQl6?IO60a4kii'36N7j(ZZPf(VàwВMN*E;8Nޡ w(R}׍G,-rhd'''vvvv@ynؾ.cUEQVv]UUt:Ņ{I4D'PY:Ct 'C~ c dn(X3*kd"G$:Ӯ}^Os>>z""ई^ gDo EU3@_){Ӧ"t3h[JmhJk>0"%%zi4"*STOU أlVo:Վ9}OLj6>L&ȪdO۵hszrr5S;99je߿7o٪$j)CHDs):PHRObf~j5% ze{щ\U (SC#\) ̮Bl .‹bʢ"<Ͻ؅h+`8fiFifV%<7qڃL.tʯ4j6\鸵&8Zy^ t,M X dtzzV')zmϞ={N&Iqba^0Rk?U6iviFBQs(; QJ-OxpqXxtzrĉiEąA$rb(w\U> ?/Co/B`vh[,6\_DT u59SJyŶ-TZY=ƈ8AuB&2 k$ƭ_U1J9B?E?>>8> 5zI( FC \>RrAA0GAds@*)cȔ{cfG1vς{ ~'k{hC|"(vzzj~ɉyn^?Ku<dp1Jb*ս娐eM`4Dr||k CxN7-QJ@JDaul*v[گO5m+~^|i|AP@@u=}h^9_vyy d eCU۱_ңbE@Jֵ6u??r_ (Bɞ Te#:i[>"#>D!j(\3yW%QbFƤu5r h UC%ZD`mE1Y0n1qRP32+fLKO:mBZ4ezFv )W\KG1O`>===0Vȋëp~ȎJrA<ߵqٙck);[MS#{H%ưzfYK @ȉQ)V6POH˻9qkTUC">!#F᳛XRRq:2a7s=%/tD[SB+cbe BVUUp8/^XQ5OD׶ۭo%"4$Ve駟9&n7t:z,xz9 s[nZ1vec)upƈQ -r;۠+l|EPxmSZ ʄrKI}.F!S Bٴj] ci޻*GS73V炸Uf_;4˲n;^׹"֎Yk33g8t8mHѝl^Ϟ?n|{采P'VL=m >٭;NnagX\&R:l6vtt{+w8tO Pim M+G3ATț|d= pz#l6䎶p1&5Ƣ:n(Ԓސ5wOӱCNsCun@\jUUu,[3^vh4F[{?2c/~*prrbYǙC33~g_~ynϞnxGd A,2D48EVשɊN|v&c뿶o}[a4ΰF8'?˿KL&K6N-2d Nl6ɕei*,jEQC-=^GyJ!=kp I2uZPc8::23-j̇C,Q4%c;99q&W#A8dž6K/=sgJ ȅiN΍ U5aj0Bp$_,XUUYǦ4UTu]۫W\>]HXۿϟ[ӱo:k~'+k`rM_l/ !C?{z3rZ8 ͭشJ5(r,=w(^d T/,O-Jkftє 5&{Y 6 T4'&/ou]kR[GĘ(+[B9"'iJhSqĵ`PZ\.ퟷܕ'!x.NQ Pg& eqN@t䑧ÇBk]__[ݶʾKR}T{r EeZ1Ƥl6KB/ '6jZKDvA$Чcv{:,kj[jhF4"0JI!h^=XfD4AEfvp(8 \0fx"c.F"2/HMT8 Pׂ?FL4Ujb!1^D:;;e taF#zOYv8G1V-h>V&(n}w3f (Tu̲3Uj^(Y\^ZWy_ӴvBE5zvYQŵbEtF(Oѷ')9:Ұw8ͦ_խbB=ݘl(qe1ndeGԉ3XԄ̩nwCi&bϟ3G$ 03j?ƫΎ6wp. vqqajoB2a]e6`BRʳ,f6c@.Ll6FpT9L#>NF "%>D)vA>Hyihkq`عAO)ifOq(( MN-ft0w8U|p(=H_" d)VJ)cI)%%Bvzzj.G&ukJ±fڞRv#HΫ+˲^zQF۪Pmb 1<˲<˲wgʅeyy{3.iKTxQʜnhx3ʲ+NI5%lf x#@f(\{ġ Yl<0ՠjT 5PT-2&tPQZɅ IDAT[DP™+Gid^~~(2Gct'8) tM2D@ V̂slv*nX CJxKM`<3v}}ZV]x12xH3. FF7ԉ#4Yr5+> ۬b+Ԝ Xy|jFfz8(>d RU5ÉQ%&RUĩ1w=F9A%c~ZG1LJ|?|ٴ 2{G!怟48rbqIU@<*uʟ={潠B||k 8a`Y!3,baQZ<_S!H(FGTfc@U] 6ݻwV$FG%h܇Hu4ӣ) c/'(K-L[ՀZh/8rrsSg<ԸQp(ƦF( Oϸ,BEg ٰ@Lk91u'P>f^ёV]O>zmvuueQßv{4SJ>]&j,\u*$l ݝG L MҠC`S|F;;0$m) ?R,ݘ'Ư$sШ0etA F*SLQ%mp&]@SYheoI+گ}= 738>H*BZk캥e:,n_ҋ:~bvww Ԍ#ě,x^0(ͬWu`Ȥux4,D*fA4"B˫(kQ@FC*6Qț։aOwҎƥTiQ-G@&Hl)!#c,l0 \FKr5,%F5Xv~`z 5nt}fO(fX窪,k/FBE^ L!N1˲jxw4P~)}՛" WN6w8"¢@78<,v*|>?P 3qQNJa>U%P%Z.nFR%4隰ENUf͛:mE5#)C2Cq' &h9#g-)86 3n-wwwT3p`Aӷ.X]޹BD_<,:1Bæk5A5Z(Sh6 ޙtK`%(4u F>4zو@[Z2=8 k|5 qJ8G0A2v)0gj^BYJ#E!g̚+Ysa\VUh4rO 2,tKN|g5Յ›i67Ġ|J!3BQ1뺎Ȳy5Dj@8ь * ht2nc8|!Kr Z͔dXv{d \_kkMQU%jzt-qt] ̼/DVF_蒢,QKLsBΓ޽{`f=23[UDV8qx߅'G~xRV Sa L; [KIDs=E:zk5h#QGyQ Y:fM8>Fz,r΍zb0|( EKD>rLff2l6ĴH#ZA},_8K1C{-*g1!Jwttd1ʥu)-mҧk>sS"D[o]]isF mCiϯsB4t{$c:}Kx=fuU\ F,< A=>Kt& u7-X!7h۩NSJYJUU{ VZ⽪<Ah>EH x4`0K[W>1Jƨaaxd@Iip5r=>El]q~pJj|ci& FJ( uQ}bJ?ps/%kIԉj H3Ηȗ zAyQ ~@A R/ˏyg@Xmv~:QIlha@I?3P%3U,1FF^FDU7s,yTD6tDXhNdrDr9 "[3'~1/SZ} XCu: t J1-o:l6%U=h#m"j^'FQYL%>D( +j76kSF˲r \.f:M+gq8A}WUXaoy11F 1 xej@DQgD0Qr *K¦eA(!Q=8G f[ݮC3ƄBF` 4K /,=~M?n X:3Au\pK Sc\Z_kPԣ\p`Zӆ7H8ƆFHNol6ve5O-*Y,ˢR)%ogFAX3_sMeQ ,.Sscx,˜4C}SӼh>{3&8!t_p =jwb)QVe92j Y";&{kYBI:dp4 ޺{gY2P^ @{W QxaR>9abA(i(nq!B _fVJiXNX튩ʮ//|]V Yơ Bʶ!D}B3_AEGl)^PdUHƪ0u;Nu.!܈j)zqܴOӹFWeAfϘ$o,X5Вd2kjR4= Cd"I_d4܌&!x>eWU.3s9B/9 YI;hΈr㥛HNfZ[ac." L穞ifM8"kFfeԜ)TGQT!&g-hTTH1lR^Й5Ty9LpJ*,(`:$kͽMv];??RU9AcQ kbQzE\Pֿ'(B'0vDY=jk <Ndžá{')emsк^C R\.m::Bh24{w-TrBQk@Qo-JhF=pvR)0t^X">4p(8KJh]iQ1^Wc$jjGq:I㌶ 0BrB&@{l6 &̇4/a ;NWl8ٙ RI )k((!A1RXf5M [ f)D5ǦE1bsZ-_`XTuJ )U"L} 5Gnx>=5R̅1(Cr7HnʸvcnAOQ t4oĜ?2Cu]Ei~N޿Q"LZ F^c[UU^n"+ДMS{qxMeWhͽ'uC0V Vyv0(`0llo%#08פq³G zrih$.ug-eh:3]I=y%԰4pj4q8Ƿoߺ[_u]|`0ׯ_beqbBdn-gqaawf:,2L, JBTkZuY{d2QV=Ci40':b4{' gYXչj#kqZjw4߿w=^uRZfR'H yQЯC[Tso=?befҠP?k6HSW\<4E̞jR˲C> DXo 2| U4ۈ@M,l(  s/kg/F.`Z᫒ꔁy^qRmB<}' JKћƹUVŽ׿}'NM#c*{")WvvvJE}ɽ"7pQN{BJyj5$mei/_...v (1/%@u]*HC8$e6Q&D3?"* Fk,> &tAԃAsGEjT|75T(hp_(rDseqSSJ\.S!itE0`,5_ڌ.//C-Agف<;Bы Ž1<[1^qҮ؊ldǑ(j)a/{ĩ9S !EEQɉ+=m,zY߀  u  A92\M&> MrFH3"j9e@a1&(i0:'!an;yCN&_{н?g?09z䏎|<5ǛKSJvsscu]{*P͛7ϖRxlWWWg@V=b(pttM).$lf_|`?ݻwXӱO?@Fv:;==z1aMJ{~嗾rXxTwka ސ |B3C f`0p'l+? 'Eqx!|'piw^'ѡ̋ȪFJ(ƥ$K0p4|5jJ]E'@vkNb>ơ썺w$k"Oo@PƤ0x'DPJ]@j$!/m6,9/2TPX63ڈcCQ22 `̲,Rn!*;;3evW_?:;0oyYӟ_Ůٳg6l6nG\(A!c6z3j:QN)g㠌xz \UX}O`r"ov؀0jc @ɾCQh̺Q2apDC=ʑD$%tZV1?A!;.: Lv{ww9}vrrbu]I!(^xη,K?|`?o{frG TMpB>8(ƌq!(j`D-jiCUf_e ^4xp® DΎah]YhèBa," UYڡ,*߃CuX֑Y[\ө_[ ^DQU٪&o{;13g1pв,CJ)!{||EQf\ vd'#ؿ~57=©e>8) g<#?4`D树 #Ө5FHuEQE)H7<ٮw:EGaلv I䭩jOR|0Ņ ]Gyw,VH){Zl4V+' +"*6^cC , N@ !h]QГq#Dq5 :͞NVuC4-P(൶1F|Qx=/3sB?k \W!5:p ET|=A{P П=`(fvP@i>::聓ԁ7irR6Y k; ڌ9]!ZP'?ZYC~smۖ?>>~KW׵`˥(W{)XeYVfVB]׉|n_|ŁЕ;襑 \YxA|EU8"u,cS>cVq?= Qn䤏F084Ja [[׵o+푺nf\  rtRFLMap&!ĂMԢNBq7uA#]ScS1>ri~:SlEXPpP``ש޽6zS2!ͦmV,m8z{xxbស.:`eYz}cIMIV7\*TE=^oe~E@I =7gmyKB5M#h~ڷBSsKu D"(eA8k3GGG>Q3lNbfPunZN!d:rʩ(^A$P"4Y.Zu`fvʲ,OOOcS^iy||lJk.E3Ã~(;9.hSQl&dV?V48=(S#2՚[P.8]zo 4s\5-M32/0Qg Y5JtNȴZXCϵ\|qE+ebIy+zYe%hwS"g>,% %l1RJ3lLxGt݃J{,LSY1m6,U]׏fhf+3+,+ȏݓk}07k0^M# 8$9/ z 7z80u8z${ 0ԓƛ}p mL&}/jyzQXsBڷJdE@Jƨ!+CelgRʴt4h4J-zߵ$B`0bjw͍MSuEL)@ ޻f<cz#ȵԐ(bj$2{exneZ) \.+(DPeSq RM%Uf˜HpX 0Px\Ve 3Nu0 dh0I`*gKgMq9ʍ5DnՁ=E nB1D_Z¸7@EGe.2BOx<޾}k股0hm9Su V,ؗFVB{1& BL΁r@$<&ДawwwnJ@B@E01ȚHPY[UUkPy=n4րHehem[j8y@[ "(.(<@zN\wh 8˲crwb5a#MCP#߻A-)TiD]lb\vͦ땫*ٮ7QG+P&r=} |ڛ1XSO aggF8U uJA8!Fl:<ϳ<UUŦ^p_]6=QDB B;:p8 }$2_y;+Kmf6jc dYQa(~S(dYfwwwwww=l0*jm^{' o۾)N&GߢQ9Vղ3;>>>` > G MY? ,*W ɇڞ?Q0G׻57\g+p @3=Bv8b[W b;ORHȲf4>L *3I(͇FA*k:]+3q 5$uTQ|Q Wݭf-%˝/.Auِs!8Ͷ)F^ 6Ll6>}dO7  X,rZA<4Ir˒%3 fR[7hm<Y%7$AND4īȃ 5^wQQ(sGIr~N*!cgDaJ(;)k*䊚uuΤvhyհWU>̖?}(|iϬ Y2ݖ. ( K)$;)RYvzz /K)VڀNS;;;7oX4vyyi޽-%'ٓUt/^v2Xecf+Ŧi"LySa[E[a)yx^'xx}58sdD1:$ NQD1f煌YFl*ū =z5 ,K)|lۀjn+0t-~qj|a+ zeY:(dDmYbN;:-dFg>sV‚Eay>Q *{===e{o_7@kbBRZuxP+i9NQl){eYfRh{x9mC1hgY%8hD@"Bsng 2Ң>>=4 Dj`G;2?5 e6cqZ 8bdZ, fvY,=>+ "Q\Bas}===^Dg{Cѯb!4MSιh"===\Pȫt=+Q|Rj?WQ@#rYʟgQ2Ȕ4O‰@M ^)QȻ=--%8.LTޮ/3]6spdsHM0^O7|д( {D[#+]IT>???`>|joNR]/~U ݺ BcfKzN(]]]ea95OcBHxCM)l?u64"cU ( P hPh1~M~=oif0 @; &m,qvFQj8cczZn/áh4hTc7PCIL_]꺶ڮ–˥Ӧ]J}X9F3 iF; dLV/;n1 y ^r358R #徴Q6 PqpN0<ʩ Ҿ\%x] iu]ʼ3W8D䊲c`yEtNI<׼ԥD!sʤ1pjM)@70v>6$cQ۳`9;|:F/~'''YAfPz9p2bQMQK},2eP^g6L65FIqm i/aH橹c D.9gGGG[IrL<ϨF}5_|Id5e~"`_U!OC,d1n5C+G8 PD;(B>Z&TEyU̶懊,ԔZt"A " c;,7,py߷\ƍNNN2c|Iԕ777hPHh_.ڈBxi|4 WCTR0)#! fxhJ xcbDk^j͋qYESW;ElB9[DF9#6j49$: m=w{xԄ14'be2j(O-,˭(9[kRzcj 86Rۊ.//uVІh͇m!I1ƈ9L'I ( QJhBY;5eTN,0z'"g;`\%`ȁ(sG$mΛ[O ƇH&2i=Xnc!QJ"s뽘3"k~h1n;99h7b(.UEz,DIkRgeϭj4eZBUs( FMD c2=1hv剄@1X.[&1.U~] Esy )d+fZurHjz>D$yP#ѠcfT_YUU嫪8U%pz8/޿Mqx&lG /``_|F#ӟW^g}f,qQȨ NV4{﫪Jf7d<"pC!dm8:6%"&# !10<y4s\6ڪeu2'p,v S @q&1iJ[(;|wVUU>rjyҎ){,Yqo.//"cx6aT:V`XLOt ŅEQ\J5M-҅hhDECڪ;u"^Er/&zP{`$?EPdw= ]'jޙIt4ҫ1jOfhDW\A8)%+kvwws&Yu5ƅ~bY"wƘ"r%wVB&Șr|Xbc3;VD%Tr2cUgUnBZE[.]ѵFfn߿}6N=ot2)Ȃrp(ʧpj1Ƽnoo"!} ]k\4IP.^U'^Ko53Z"Gŵ ϱ~i~ ѢUL]P7 &"V=MCt0DXRZDWC?z.6wAᓌ^__o L8T8/-Pát~r $uaYxW-+k6:u]y4")3#(Q.}<[JP]vu01`!F#L2DG=5}>8Rk(3Qߵ9ȭ12 ->Ə|p~2pnfy0WKSzVmvJd~A:VQᇇ̜sv~~ub^X]כU{šbDN*s0NVqO)Nۧm%p^.&Q /bbꐣ]1Cz9g@LzoGGG9>==&XlzY@Ҡgggvzzj޽䀨RCT( DGo+-yi8tF[ )iFP50傿v8U l)"=CH4'E25*+q b;eYhz="!ki\w*8Hvvv`ʝÇ{{{iɏ1nli^#2gv`ιULе) dpc^iQin(jDAlXxye(|њT%veY\*޾}k>|q$*)\_uQS't !ػwr 0NʝRY7vfsE;(We1:dbwwwZDX*DjzJNhfGA}*K ӧOi.4' GwGkf@-d"*:Z#SG9yaZ)ƐO'Nj=HavV sOmu;uy0> ZP'NOp3X1<2xssc?Cf,!yh~B7a|^j C;ABi5'Z!PDe*LG,0. 0&\rUUιaZ.E4\렀 by 0{&2Y^ϾK;88sטfYXJFusOQ0t(qdkR[QX=8.Rd\Ai$xPRd'Yi^F.EgԐ#wurӓ[. dª%:ԑj烃-d<7#|nV~)'l/RϤ9lf21,fUU>P8vlPU@ó0D 1cnnn*o9^|icR.u)l18ݻwwٻwizmr؅4kQWi2F<JPF-ѩ RSc"ApޮGF;m!dLi_z5肣hԥ{Q@cM㊦o 2`9:@....˓dkߖ^k{MӤo+r'44j^Z?Lisf:Fđgu'k$C:ޜ:h4hd9)Rzr>Z *X4i{_L4H!7d2獎CW"H^vp|?͡(,K8KJa(ﷃ;KpOHOOO`;,)!}iYUUY/-]F^R "%><zPYtiG󗺮]])se4C04zNևZaY\DF4ɵTJ -K-o޼*B\C~87My.[%^\\h4tjo߾dbpˑx~d&U(WvXYRMgEFBƊ+ce^4'glDeyiK9 "BiW #wXAtC] 滽k&f}g}1FUȋL8ཁC2|%UOFzAlCNJ`G4 ٠G] B$@ؔF|zN(xٍ>}^/NeP,˼zrrb_y9Bl| K>R*B1'я3V}Q#C9Hy<뚽ZoD.;rs -h^ji#NkasFt:ZOT(PǏ)'GV4c_--`%aY 6?-K;??߂?6sg?YejbiRlϭGDZexO,L}+ދH xR lMK^ze!|QP&U-h,_ !~V^uǏstj+otК5ohD~]Z {?mUS꟱Ba+u]%zA3.؅xR]BZa;a#C$>>>;`z (ȋ#iZmR3^ocx^{1)V#,$K7Ez_Ji+&ChBۥ'(x?*% bLψ 3˔6}xx υjyFF?woϹꫯl^Ǐ}6G~rid[FŘTIQ4P܎uʆ"T*!1,D Fͦ)K!QHZTכya2t:vvvʎr-RJ4vu}}myvvv6OӜ7~_Ύ>oqzzj_}UVhEMmoj\7lp˥e9E1"쥷T)=x/A=h^m ff.Pc߷ׯ_۟'{}]~dWWW6LryA6.8":9h`b0tK  ̙BWӚBR>>Fwp8jH*7;no<==N ܨB3Ύ-# XݝVuă}xC؜{qqӧOMEk̬q=^(eP6Y.ٰ#(dL5t"g27F.VϒX=@PXcD1vvv׿u v||Z'Iι\5-QH a(E;~PӨ4M& ^vXVp"GY4`rR3QW 9W((E l6(!0iM&=1Fv{{k_~e>ӤJOE0d'[._"wuR!j3[;):l6~M>|pDR&$ƋY/X8 "('&π!\ϧivP(FGԥ4u<%ʲ_W7ٙn}$k?i"Pgf[%jBʈb@曛GiS;y8;A8ǫ%<-̫|28 e%sFζw'"ܸ~ri~f eɧnnnnoos;FKL.: dK~y`0xNbcڊbΆrUݵ[zvV['Nvss tC~!;<<9lCd奥͛7[Ns&8܄`f(EQ4aXĦi d 2ADV^z-׿E@1祬c抷xtW7'%*?8m٧GwHÑ!;O4Ŝ)1HmQ]__}8g~ mc~uJkQ1$x.-R0v3dyX8RF|zzj4?M* ?~hG'PZ^~Wy0(0snRZVcX,!/R`rƨ Tȉb`$fY8@/"Ơ0GK0@lj\[=:k+ \xlʠՙ?Nx}yy۾ Y9q|QNbOǜk#Tf4TYZTzRJ n+scS(-/ 2=99/lfo޼Ɇ^?fA{PiKzv07 ctc _3Kι|FJ5`(!r+`o[;<<>d2VLdrT V)quRE&"\WY51)5(ŵ4Me)s.F:-5quvKJYhUU|> `le,oEL&9h:AQۧOľc54ShDH YZeMMȻ.qKQ*q!prx?` _~;{۷~h>o1 (\5ҙY;Ȭ~-s Y\]3BTB(|c0<Xs1s,LK-:oY,+yִ+ofpV@JJjG"wP0seq|RL9zY(^^^^n>!o6{ڬNDjL (LQMQi4SUU[nEa'''[!CNH/4VYU}ɝهӧO0;`l0VH'E#: eUlEA^ N[9B1(X)0Vct\@byn9AK`1.g 捂:DGy@Aƕp55PdrO(J/9<|`y>+`Q]c &ºK,EK"u K_qDjc>B[#j|nwwwt_" y1  p,˜2hdy#i:DKuTE/¥Hξ U~v~~n4p-_e<tp!6iIxbtMkCvPlWM)B3_=/mwi}1^>r 5f'&\ZL>,7N|X>:NroP~њ:-Ƭ,˵t`0:+@ÁtQDopL qp 9c*Qb28,3EQi4 R6 wYQl6===1 c̓K&ҪDЏ?===>>: l==5)YJl'HFLdY 5HͶ cW8*۞RڜBE9::(+k>}dvJ2ʛYι97b28arXhRHޤ)0H ")цkUd56 KLLzȦөاOϷVRUnp\oM>m*- 9(~xk$J^s c`Hc׹ޚYs{{{t 97mX!u T .ب0O2錳ZJJ?]\\dNw}g$/"!i VU劢̆fzn2we.q LZW/caQΝHVVZFkUZSx`ksTy6#G``gggk޿ou]g#&x4+]UaJiBثj3r *J1ѫdi)QZPU_SAx^JyxxhMUf7CsNOOm4d2g;<jey||̜LJ1X-r^I^KY>K)C í]6R*xlvssQ0}}]#LWH(EMRK'jL(p+ʞ|YhR 'CՈMU֎o^#: z{9&=ň7>/Ӵy`ggg@H+`0.w1B|,˼IJɵF#܁s0teY=%D.FM[#pPp(%Mi4P67Ƙ7B`xW E"p!8ph[WMq%C2&Ț_e.0T(&FirBcwt:5eNynE;ڌRy*S=ø#kMZ~@uιǢ(pNqJ+}ST[]HyyyĴa IDATw ª#*b37ų Ea9( ʵZxZx{f66æiΎCףzݫ\Lj,Ev)yr5-He[1\>."VϬJA` ;q@+ ]YX5r FUUL >P1؈<xt}n!)I݌1umgFT@2vm`$Q"z qzcO\L@X*AT$b.I4.6ӓ{~~.~vbQJNsS9W===hzXb]75_ERx&-{O,UkcBq0BmSrnar<6Xh ;šġ9Z.UrH%EUGu<? uGA2!j]q{6mh=xyCY+)BW%BͪޢN}!1Hgk׿=>>ѨR1,Ozq4vAu{{[\^^^u `gUFJ5\Z ]P(voPbAʺأE|Ƅ,QX*ۊ0&j(j~:<"Ox}~ro(C'@L.|M^-g!Su]uŪ`0ȹ8L+ambA,(gJv^^Dw_><<^ !c(^׃`XWUkG=S:(84"Ґ/Z@cf/٥jl?b j<:! Xq@)DI':],ޕgo=i'-Q"|8 !r/ ܦ ҉ߐB4%52'i:QH (|!cnibu-#p%eQCyS׳޿zp$Bz_WJw&kŢzzz`08U{SeY5M31C(͛7[29^LN"&y&(ϦL)@959֙0&ZndBeX ,JxL&[]g)lf6(R^SbD拠*bF~:fPUFuWUx||L" R+yj<aDgĴV4SSq u( %洙#i `bKUU/ leA@":eb2lQq1FgfEcbry?!sU4U]oqt@=t#^F4Qyu(& O!O\@A\ edK|̶&Dr܏ƌpFfR 0{hw(p@~BaRf.˿81j|Dȟ~N0+p-\i;bе5^Ȅੀxg,Kc,Gf4gd8V=nq\ sι`}YmғD&Kt4U Z[)r2x+rp JC)gxIASn|^-J73'sOȡƀQ0:LpD~xcooo1*iT*?vJ&Hh`cLL sEQrc7~]æi|gXAc,ޥ2@Ji˃uttd8~!p Qu-b+Ӛš.՜(PMʼn1n= (nfy'1Ƽr76=<TqtzTsTU7G!4M\.9Ѻ5,3ۂX$zxx7"1gQ恻#2 !TYF&QKK @LJwk`j FzOa`i'c2 bbZ2FqM!CU jyHW_`DdXN =QKW#i[GAe E1X8'߹sN .nJfNk/sI,Aa;zZʲmW(iP^U*s/u[ %hkÆ⌴$A](;Pny0J l/P[ySH?#Ui?%/z-chτܲ=6M:tE@t`z1Ƽf<K: 4Ķ;R 's΅\*r9gf)1/Bs{޾ s;W^Uժ\,~8: c0d=_͍l6ByxclG® ^iB18d ɒ%HMBAXRbD]ѯy2XiGIh仐6̅6#gd.#3aTX8,"P]*YU~gPc%ږeu瑡UȂU8cR8wÇ͛vRI `0-̛K)SJC3K)e:ysi 0t8)sʯV+?`0pEQ8pA2h10+=u4MVtʶxM-#H*BeʩqKk{vppuzf!PdZa*ԣ|ua4kz=ri6ϳL Lyq<;Q 9kJu:@^R7Ի i (M34A =NGӋ$Rp1ιa+)SJEJ~ӽ~J,YJ{R:jf6{۔ι^kiJ}ctEQ8"iuι|v<9J$Vu:$8dhCTYs[@CIPe ^aCah=T)VCY10yt<<,˲i*X:zUU1:OVAiД"9Ii^aBia6^D mSbhx^Ҩ^g*G.ʂ'vQ$w4O4ʐܬi^⤼+΂<>} i)tS!jt^f hצn p8x5Q+v@j 75H"ŀdΉJjf3; !{Od,̬J)U)̖gksBefsWER9Ms_=( ~vsscu]Օ=>>l6CR ?LK%(2RJa~OX, \԰!h/9 ^(@d#bqv(Ÿ(9 cyNnnn*;ƫ<M8Bh̏ΩZJ kQSg?|;q;[mrDn#lÄٱsn̢>VEQ<{qӏZwf6(B|;!Q,^zO<^V|,%n_؞i|֜|DE7BG6JIawwמ3lc Wͽ艤Շa'@z""a@ιL0 919:&xXm8X^ԊH!ᤴ3J`8VM ruf\ȧ:waW&m^=}af>1.RJ˴9!},U]BI h : TI "V:NBN1A8/QbRV49"2$ ');j$7JD}r@*I^g,㢀8"~v{{ežX9cw)RJdb x0hU8}1lP6w됐)!SJy?YvyOnf[]u$8 en]j>)σι{̦mib_EN)5!RZE1M1ƺ1m6g UG]Mq=ϧd]^^bQ5vLLm<Pc$`&dF ELa*2": oIg9muA9JS Vh,w fZmҝ; HZử3-=FQ E~V`]Qi4ԇ(6=ffk}pΕ^/Yh lCӦ_"@]Za]#P- Aq1D A Gs`5~>h|M>&zRDauu dZd`5Aޗ)~d]'ιaJgRac+xcD"ϦFy"{p7; L>9F Q~}m;C9sL.G04]BƘՐy_yt4^vӍzzzWiJP1'DQDq˸sBfW)>7Ȝ1VeSJtu\\ x`\;cm6l$P sZ6$4Ƹgf{UU{ι", £%x&ɚ;Mʡ{'gArwEQȰ'=<j !rA V<ֈJ3d/U̪c 59(2L=t}4'p/: !y/E1(yo٩fv'̹X]xP!ٶ6NtE۔(Mɢgf{;倫scNܬ(xP0`iDp1.b^g ䷷9Yۺ*s F+(P&u]gE|5* mp|EFOdrWWWvWi#89^ۏ IV0DAу}8v!N*dFtT1Ά$ƌqR{:t=Qڕ@q5k!kUU>mwl7nZι}3;6YZRYif>mSBAMnQȪzt^ZW#hΤ)}T|fPUf"ve˽6N(6A{,M4REP*]aGIws}(c{K)Vc4>y);`(0Zb"ǥfv-34LLh4 *MӌZty.9kuW4|6pKs4n'29bC܁M{cuY5GY5M`U~̭8󙟪BwӤiU1a+:snB8N){?MSvl)D]ϩB2֢!jA eͼR(P9q5<Y@y\| IDAT'*Q&E> Ca凮 w:{c+FBGXYUUoQ;%jf]χT6:~h׳;YJh&1V%tWd:aniZWH}Ӧc<18&ιm@fAq6}&vFOF %EJ(4 0 *x1XeU$Kcu]5r-b(XQn$ XFndN0Ff/˫h899ɑOK: & 0Ξ]eԉ䷷;8TjuXOEܔ9t .4 CR=ra[u}Uų 8vSGshY-ȫ@;P8?+LkjYaf[RF)nTpV|rչ>J"m1mCzv9"/G~y6dJPŽ]͵zu WS:+%0fț|G׋2m:T)}@Rhq(9 S-ܪ')iKTF;HFB;JS,j{;:1pRC(c3ٮ˺HNܬs-PeS{q5҉h Ϥ#cPNebs߷Yx@S&Qu=n50y$Hr73Ժ*ww/̟*/je777y"=85e$A4܇66mc>yf\lfH̶/@1t5c|^.D[GDovz['\w*!3 !JK y]JM(_0Xf=5[KN*E mZ'I2{iPBpeY˲|B_|h}D;tZNY(̬1{3ugιcYZF]5@;![T$¸nbͩQKhTbv|>D FR{iG+"+)1Dc.r0M4zmȼ9LsKYm TttE&8P"8qPS\pPQ)v^8D4gFif)4o7|Dc眽}־[N!KYsG&K'1c|p]1o}J E5J~ԀIh$uaqkzEu$E"k)bx(3ĎxrK+ި.VCG:sKjֽX5rv-*6%c<g}X_V!10%`~;}RZ>9fvcfSJ)_y.*T&[BZzq(O'x1*DƣTsaM& ym)0c`JocQL/2o)}!F=\4."/&]]]m9 9 p[4F!MӼSGPt^7Sй!v]C-Icڑr(ܛ F3lZjJ=}1P_a?s2kU᪍O1Sf!{8(Ă։WϦ6#FgmgkA ]#.ʩ`)آ]Wwtj/06̉BL!UP~T$ԺT )D'2Q( >'"s"48t Y+2{q&Z:QN=dgp56n?y 8 x-(=@CR wt:͎κYC'|Yx! Ya, ȡ%8u4ء t]3L\Dr ZDrKւHM,V2hD2D䮮B5/r!J➏|>jpH-86ly@tưME-ZrEfT\y^lng: ؞=  ^0G꺖 ۷3bf@U (h8FjX_~DcUspU-1u""UaBp{$.ձ Ƀ 0A=0ød Agϥ~kHhP:w8J`&3e6ePAAUem8igb8g%ƍsQzqO3/_x^6>i$&JC>LdʧO>N|$}.G^s锔YTuDijJTCŔٛ~JqRWιSC^j㽟uݙ0PYUu!z4٤ "fT]@/Od>,Z߸29`5}TY(6 ] ?L/ED# tz%3^6cc0cn!i34ҺOs# )ZMsyxx, iVEDr8v<ow;rEJu)*UND>S53MQ.\RŤZILD۸X,A>m x6X 82߻4#sGiDb \ʋ/2,'li}hpٰV B8F m/:{͏Ӂ', pO2DD7UU]j\|pZK5!}ŋp(BnooDUUps}̬tmĄ,35n !Ac@d6 n7Og4C?߽{'R^zCcNa/5dۋ%,"5;0ؓ\24Cq0hB⹘7YcOt$H0 ;B8w\]]l6{y]f§rqq!0/,۶UxM|V0C%zI+^՝TոY9UUU4IATHD́sUG i D>t0 Ԣlg2lw=vsY^h;I$rvw?fzhmE b9V6N=J}+Ʊ±N֌̀p_,"k^ygH^hз* l3g1Xou/Q=D;sN8fJS9xC@UwwRUU+ H20(9,sFVySZ\qXg!1JV'pJ@*H2rWB %;$# 1JŞ͎ b\Xc|Ytv߬E锎* xc0W7dSښNrww'{ymNDooիW$)e:¤ /Ww RDںfDdTgfcaQZ:Uݧw$lmfBHWcؒ΄4tK@a\2x 9f.l"gܼ4M/%b 1YUyC`8㊙&a +L`_lMJZ"5F#2a:ʋ/2,ˬFf#Rөy㋋ y?|QꪪbˑZ\A@ zP04A$05f03 .'kT6ߑӽwm/vBp/ba`1Z{h s29 NV[K$3ǒ᠍pu>|iJ&Inp8E,,$^۶9!"GR0.[x'*M&<v9(eG!/w)|,y [4sL&r~~K?N3vQ`]JDC92:!!$ ED*Hg1ā8ttl#TYe(x rKrl0`n'%/*p,2bbA諫+9;;xQ>X@s@;!p_d=[߼AD5RkXPY0 cD|۶M d]UIf _~z6"^9q3:Ė%QsK%o>n#Ed~WU%fO!J8lY\z5 !x\@[|C S4.n}e5V( H.(,IUU94.H fVHH DԢhBNU}$ŋ. 8r˶{~cK 2xH^j11vB? ׳sy :MD~;fŋL r, R= qeO)~+i Y#c,(:j/K\heqD$@b\x>/r¯4m8syyy H+i })*AŅLiw3$FXqdr.F(L3e3brZ !H]#]pgtzBtu]C\q⽟zkؒ"2O%dzvYkZ|Vcu0H TgLfVMK*`|^BaO#TGENV0Otl,a꺸r$Xu`B9ޗ mAs1vf s9*$@ &.5v9u]WÒ*0ϐ9dlg< !U 4R*_ 瀈+MW\m[Fm۞"2Sձsn$i#VqUgfC3kDCJ*Y:AcIʓO7VaH ,,˽t8 b>PMGgN謲%%!>5˞`|3xA61c3#O: 2drj pXzdy.1?^? 3_n'777ryLLĥ$9蓰iE201¹][+N%zII:;@v$ZR0W9*P*33=]@|h/K9 HA&r"AS+Lvu9!q` j^3R`v+2 rMDX^xT-GD` Sj*h3=̀m(y^`eJ8 c9@ L<5OEe13~DIK-zd=mTJȂFR:&[Q䠺"CH$y[UU\* @;K?&Vj;.V2 .&|z hʀ:TF*)̲zjP1fKI ۔6.̴ ])1`00(^n#o[jh/Nj|8J DW~kr6X+>q@k qUd+bS_ITI\JLEGU4yqscpF[%qaOPߘ3E1Y@Z3@1CYv@JyUL`'2SPCJ:bmױZO53Ct:۵35ِI==;D$' )+H+5Vr'KFpig&R+D @vSA&XْJj `1@q{HTۜO,ڡ|1>K> Ա- >V0xx>c~IT‹S9?~j%o߾cĥ;8?t:昜do;yE-0fumM<|]ףX*OᾈC2sdsiz6_8%Tɘ;2X4}-yt +6^q=dH I h\l|< `$ĢW!u]@ӵpd?߸ky @&p~C8CK|}TiIC8]}|Annn*m+v\i.@]yxJO\,j$`6"rREBFF޳nxx$1PH}u)q%s9!9tπd)9[)o4ι,UuOZi"$)$`h#D4G{\O%ڗ"TJiCgʮPuVyϹx'ȋE Bsbo0a,*?sRUv8>y=ǵL0b40߶;N60A}l`\L XHbι΢gOf|j%V.//s74X Q}a&U\mm{!Ҹ`00r 1Kl 62(6PV9Dž+ 9s:xD{&ZDlaiVTHZ"ODLhUzSMf+"MUUӡsn+"J 2cK,1q.ۀ帲'\._?$ %;Ne4Pȏ?(ryy)ײ^s qFNgIɣ  DpqDr^-3`]ׂߚYp sc]갮1C{UY +e pװ-qu,mEb)a##3 $#ק' : Lčv#{KFc`1$1f&JBG+>q^yf}lAmVupQ8X)vts(g'tBHXt \(+?&r µčx*9xuحD{u#Qrv!J h;X9=!T}6e}y U2S1/C!Lmùel8Ap؞V7Ns~bj%rww'777GD[UѲ)&pHC7ʌ9x<fmMLD۶a9ؿ*j6Tԗ/_lNiC|rZUmuKnYd 2K g 9 `;ͪyVt}$m$( ;3ۊ& 1}X4& L$CuMW"ܼlK á 8m !R,VWf $/=hG.|bLcRywPq 1`Ym9a:H:N@JՏmWv^@UQUs9d}i4Krzzz G#CSԯmw8[epJa<b2%Y[===36byK.\"#A9VSg-mnb+_Dz@WrqVU;\+&lmcvȹŶqS:ًjѳq-UF05_eEd9lQJ2Ƈ1f^%;#|Wxlk暤{dA(?;t ^T䥲3u]^ մ0cy*$'''rqqme^Kvq[ RK{i[{h; l %{'0:j)XįDĺCv t$Ѣk-1/8~X0@إIY/lcs i\D 8ls~Vr[9??+B8ZpPiv+u]h#G !`4wrr+ lmaC*r]=OX _&s/d"}y&2!I7䊢J:&}5s\}2gt{ I:5:6=[S*sef*qCce\P%dX1fp8(k}7ǐ?Q ]P񠦢2~>}{Wpo.q )vZT\2"]UMh jBQmF<C:+"}*d BRy]&I37X:l9H /|TtSRƢc]S*M4VNHPS7 BRnj* Hll"p>m.>TuqV O,fƽȫW 2`f9cЂm[mj&p5M#\ | !l6)cFF{?H’ >堚b' 64@9RUfXLDNl&"S3;)쩤w%ڶ~6^ Yg۟Jd)oAp`jy?;8 HF۠Fl6\fXl6;gv`JI&V$lWu'33hd>ee€s^ܑcKhd z\-^cye\joP9Q#3t0)8slBIΩ*1B7nݫ9yoffv; !lBN0ODdVU@b,6pQ,< *Yj%9A@(S̉3#Bd`'8j5CKB!FE pqqqt֤xlK !um zgwrr"www2 Vq(0 X׈y}u;`|N,Ջ_ROS/I[R)YbZH?rc#trOC9HTcV̦]םYa6xfv?KrEȇu*ϩȱ7k@ɪ*ggdc۳s Y2B]-X|W䅞J^xxsE4s.i~w?\(X˧O.m&vp/&>(-Kz~iG(@ᴬ.kF+?2HPĵmQR9b-Ifv)"+Us97јt>L*,Jwy[ND%'0ѳT,-8?^0(=٩ROhĽK)ˌ5iD=<:!"a/!/_:@<(Ѳ ?ؙy?fehS8UVv3,0MRD.URUoT\U97[ 9疩j vPej %Yw؜ H7;xD>T̜K*Tҋ 38t(yuNStkW_ ]9*W׵!1zl>͎pJq7'B^u:Jl6bukXiҬ4VT&>YU!B5YE;0s.1qtu`0@,9C,\I6ιeaιEG'U0zQՅsJUιU=>Jmsq΁$&!a=qg # Ū/Ñ/E4=w^-=`h/N6l?Jqn iLDڶmzrmA7Ʃ9d2Q0,Z,T7e'f9mnx97z( { t?'%܆@IwLs3Sg)̪6ݶl1'AUU^UTR:˹,"M]5z-4= !2#!+d qMH"H88d0^LО I8t'&xie*luJD1^pqgZ\Zvfv'"UU"cHkf? 4Q$mpc|L $l6ÇP׵|׿/^;# dosB\Vzo?3d,c^RCm YH0)ݘb:,lJLBبRDTϪ:93 D"hH9B!n|{}b{39T !ooo94 'E?vg8/X.q[T6BX.Y=ŎWǏ9'7772 dʷ~+DyΔGsUQN*KAKvE| `8TU`B IUIqsR1Fr,q Z:?3$[qٕ PTȞ$҃Lwpc f| $U8π."niggg*I؝^&"j%";zjٙɉy\Z(FVU r˷~+:/D.\\=?ˡ,@q|fթ>r Arzz O>|2'pRq? 3';J) B+ld+J)J+ "̺4Q!]uh|"d'#9$Z9ؗ+[$9kAuȄ ԠqdcՓ6a!ܱVR)Ml'FX3Mu]DdBdfnv뜛G眯JCJK* d0aMTF?|>_r{{,m+RUWe_|)_r޳#g}mN%3o~Ȓq~oo$Xr: BBySHl# ;> ÄUr{bXD>06 L@צRmorA*IjgHK7ZN@%Qh NPIUUqud%Y9>(o{" D"xkƒ&m6vu]3ι9:-6lۼ<(9،$Wg[6I N;eyw!E-R̢U$p^ScKU q;T D$KB+/ے;'& ,Vc e}E5ך13 s#mC4: HIDAT|~k""QI(yaI}uu%@eZǏDp8h$'''O?兑\h 2dJcwv_%"#P0,4yqN `Lbh"B } ƈ丧rlNp pB8Xkq^Ch^ }b[^<<_p$TdPcԍ'6j8mk$umV{usι$x b@b.8OO/AẔ1{IL})I#9{q`^ gjvyM;7UKL"@af^!rܖ㟟i9<ϐ qI`pM܋1eD`7+Ic՜yUUUU!Nt2L~\J4ׯ_Ņ<>>v3Y|YVNNNTlV?Hu[yxx8z^A<==5+?98 gBγ~ eOOBpO<@y~*žJ>﷒aMysY*+v }Ɲ%. f8:+KV:Eb(9/qr:>IXm{`~gғ*i]ӪR sÓ|>-KÇ*1?g'PuYj&|*dr@뿲m)r(ପZF#y||<Dץ(] ^u-o)U>"-U蓬,s y8ge;}j8ާ=SqNm@!$%TgRt\DcɩsBU_ȯ;UᅙMyl~vmz5N*`1ihu]Wj]UǓ `Le19C4GRQ:Y-m 0Û7o?Ϲ`sNe2l6ۥ>K{3rww'B^|M4?Kak+\' mk18t*ÿC|3 rh$5m{}R;=]E}^ED=z\:8~0vcrqW4cf/l4ܙ.RDIhl193UUDdb١k1qq9ۍnv\Sȋ{sHłb®mf8ׯ_zzʅ |rqqOOOe\$qB^rW_e ~4Rc2b8Z>~(W*c0bA$-X5N?SG1e"o%${l^sR`p .mdskߵ}RgV1"4<EKUQ I +:EdBXiگDb=X'1Db]s܅sU 3;z䜛#/2/UL BŐ!>!˗w}'!/^|AڨzZ?>>ȸu.Iۭl6ϲTU˥FPMbpυ]gp<{/ 58?^<_y$הΒgot‘4Si1q`qWι߫ꙪsjkY,i{:GFwr>3{{mf/zff6vqˁL H`i}]םM d-"7@sMDR쳳\K&]1A `v=I(fx|]R:)gY2p>qqsْӲ',}sso,~I9`fm$USu ʁ uH]iUU^8^[yu[ܹ]x]U󄫪?ajm]f^܄lnyw8纺=Bx||ixH`DdˌF<߿dJl6,5kxvsZL͛79>RU\\\dQ\]]rc`H?ǎإJ~|=ty 2~Vq;yl1l(),U+/JX賱dϵZJ- Vqʵsnif"fVcsUU!.J'B|Z7H9Hc̪nqӤu! UUyi&"53p8>l6,X,r2 lݶmrvvcH-E a .܊koFNNNӧO98Nss.#+1J}0'+%sG)QeV=RRglJ?n3]I]9t`mՕTUCnrr i (=HSbg(r?P%kF:kjBXj,y_ڷmm`-!xἼGiF,JP۷!@4<==nsvuss#f&Ãcflr^2ew}'~x͛7͛ς,9fկ/<Hq'V@WJ_~^`j.{Y >c_bJ%4{""`K*ё}aM!i[,3sh 2GDv0p8l%2l1u].~ۿ۠קUʰ:yzz0C}qq!N>~(2J<<* $}zN+ jg B5[Ty}JSه>[:1gi&"9w+ge\9Ƴn`FU ~$y|iaqX.vyy)Nh4Q[<>>d:b~/IچA,$jGJynZl6x,\á9a<2@m[ȥ=0}+24PJ-2>2qKgDQyx'O| Uლ+%/IR@?KfVfX[%^} D!0#KY(psYWr1 il<gߩ24M!ݝx8QD9'o߾~/޽48T` q~~.gggB BLl1s`fN c*óXuõ_nJTҦ-ATrY d9damfI("9m^w2H̖4QC U2K#z-Xөkf#?~Xr8ӓ\\\$j'|>ǏJ[ox/t.<1Ti001yfeI)QxDt;Yuz:ؔܶ\P;3ܦ\32 XJ<[ߟ2C.rA㉹vö&ڀ;tpp=h4zZO?Cf3𜞝jӓy&:X,9d>roV^~2a p/Mt_y`Ku,}/1;_DZRdrO #x1-Eg/(aMj {ےTW/9vWTrժDZ)4'Nh]2ag>?)I3 7D/A0VfZu p+W)emo{8.---~ߑ#BDq=fr):u,˵Vu4Fau;c4Mqe$ h4+Mo?pÖU^+u(f.\p@mbb¬VfZK!D.MNNV+Rw_uK_Ҷ[I[QY{w#r---]*칹9ZZRJaY$ښZ[B=#jډ4Muʕۿoz_җ\4 z^z;\\e aX[[CCI{zz7$y_ /`}K_~QT˗'Ng}{azp]:ǔY.fR5Ah9==]:p\\\CkyC?я_!IJӴ$K.l6\.R ""X8$mرcŋ~WVV~}c=&|wKqˉ R۶h4$ 2z.Zh4ܜ뮻gy~~/+P= ^W8pڵq{m[m 0011$I`68&Y)(;998sGg}OuA999iJ\-U*Xfǵֈ㘎YfJbJC=6!;y>h3}[@Y(۶'Vk.cɓ^憛^4a&$AIW_Ra?Nԧ>u? x-R` !4=pܹr, ۶sF !P* DE<d;%I*HX___;N??=DZsrEB`bXUZq<{ʁai"MSq qr;Q*E0 RJ! 8ŋ޻#RkRd@`_O}JH)m /t:{5i>MshLӄR A$ü4Mk*==Z?J~n@|IQO;#NZ uscMB8Q(PJfRN#YqqW^ax+"kR 54RSOn:tjU77۶alFz,kLR U<0Doo] >uԭ%اijJZKKKsN:z(ɥ#=q à,/rǁi"M\b=RUsnnKA|f2 ÛaB&eGG,7E=\CoH2MSsii馁/ 2MRٜmZn[B*c i au]A!LӼ;mg-X˲+WW~~ǕR s@> efRL:u6#iq\Q ۶s(lB) $CcYV(raLOOeywߝ?{^z饣vXu~~Z6Cuz]@nj 0R^oA0u… uZ:thl4){Ujt J׮]ly9`jjOOO/399yWַI666v? ȭx}߬T*6!ih4055dU%#LA|J!8LBy۶yJl B,//4G}S۝򗿼R*0M^XX;2 2 CLLL F]#q`v@qUmۆd8us0Ɏn5s!NZVY__?я~tGofWdOÞ}YYVF1eYf\^T )b$1@njޗUTEQֈh_Bjg l6qEz=}޻C};c) IU~m4䤘FR ^.s`(8y Gbee%O˿KX\\̏gDI)nO}Zk'"ͩg692}cd7h?c裏Zj:3sʕYu-uG涠X CSl!wwrr2ovHgΜÇǼ,:~x'~AZBJ uQ.1??g""'?Iemmh4vVg6̙3R8v[cccc,2&&& *Jlcn+7_$؀+++M0g4766//W`JqPVq=mo{6&''qwC뮤jMTU'ʞIHՒSSS'xk6fѐF#wKyCZSv؀R #"Aylll1 0J0iӧO6|G<~^7Ia^.\獩]͞!$z=ziW\"WT @n}rd8Ç )% @ɓ'qw`aaBx%J0 hbaX3 JT`b=&vBĶmC%RI)Dʛ8F677a, aff;]ő#Gpe(PVqIz$R)j4h68|SV4 u] ;>&&&&cq<$$ɮs{Hi&IVpws;A6Euh1;; 4LOOjիt7qP.ReYyc6ֹKMes  gϞwaD{g6trr<5-/ՒP͂TEzO4ORa׃ @]68,sm\xdNy[ }#~Uբnk,,,,&I8VƲ)i| $Yjf3n^Le4̓M>u>LӴxy/ƿ]GTO:/cvYVj͉ c7?S@BJ%_k$IiAUwwbD  XS6yMec>gf^@WUj!0 n|~R(riGQb/K;K߁4hR?~l,NΤyl-Ǭ%IӴl6#egvHڶX!$If1OA#&qxHLIF۶1111$oI- 0le=d~~~_kCT H0L0S?\"pbL) T"FƕXN:ɶdS&f(+/Ȏ9 a^BnW'I "p%|#HEiz7݇W@)j|xnPJ).e|zqqY4 ÈnEѫʹ\Jx0'fNڏ74чg 4MkZ !w&[Z:,>:SBZg*jJϟ? bzz:zyiKEIrhʛYԷ U8㏻wqZWk:,ۡ=NNNj5HEQg*

c qsLxpHFcf܉Ɔi/>qDMTT+7Xr/MS"XXΓt!q9y/OPV8DRpݮFڶ뻫h螭P6Lof<Kٵ,nRaC(yZ/TO@%9Vu:]OMaF֚;oƗl(X r9_Ɂzx"t<<0kvt/ۥ]D2UHJg=9ƌ G-1Tσ;Ii\ ƥK5+Æ!/.RORY'I766ƪ~Efq<`m@$p,/Ylۖ?mB n}C6 T^hC|znTb;< #p`h}% Vxꩧ!ĄR ֶˊ]m즵87M}?XsBL#B cvp]7FE=bl=M PYs:1 #ZHRY< !TQ$=(/"nyȸcZ>rHSk] ;y=OR[ٍk˲R!D@^]چM)Ƽ*?6|^ WQ4ϓynvjv@n"!ۉEh4"0 #@j)x`k/҈P|^;II^I*7SF<)sCH=.048[`v( Bw0J)MKrPldn/wwGh}eQtd+U3Zj- 2Fiaar࣏F1eziNua0ZդxM^u a-04$Iq\nw,j.~'PHgjd#P(BEyG|ƃ؃K$0dK2[QY !{9aZZkƌ4Z>*߲11i4\/Z':k+\`<{+j-1 0c]\3Qwy{Ҽ7LgϞզi*4RJ[XZd$b nnI@<Gꄿ%A\__J@bFʗ#fqH 1zٍb6tbx˕,2.Jڍd2H ض-RA;N@e6¸d 0<ʼnVx;Tm$bkf@iw]B0TasssQO1<*QB|j+(]ZZTz7Ia(!";Io:v%u@8T< #`P'; !˲RO! Us߉'gIZH"aJ:RogIuM0 - vi3D<'ŗ*ZW M&i$aj {G Y/4qpssHDܕ)WA᣽hl>vn+MRAKJI```K;@$pmEz}szzH\[PrHvxWy^c"Q9YlaXW1tta4N'5 (RJC4R*͓p]5fv -L*nF=2nKe @VKMӌ ցaqѤBx `;C\uDW |~ w0|v1 ģ}Mj`nn )˂*9W!t>U<CY  ɵVyizOkm*~>/i:;;z=VhbEۡͱI1Rt( bk`ޤ4MTEq>9 8B5PB8FRAFԸI 1l!0`n5{K٪?nBJu]=T`f*T2L<*#; '~F]^Z aZjgnyѓ[&![%Z =H>xm0~JX2OB411Ҷm ?nlaOAzydeY~\+Jn(NƗ"=m(z[ܠeb_k;[BH0lWn҆HZltk˲Rw]7TJEI$4o&^R\|g8QCVE/?!_g}y@ %JB~ߟ/--ٴ܆($1Wm<^߳s-QT,iRT,kzY58Ez;lg2=FrpN=UqVR[|%:Z $H p )V I*9r08vF׻aPn{+ !0==x7R)ux6iZ)HX^^#z~|ox衇P0ֺޒl{2@NDB$DDexޓիjX4fpICkQ`_xqKZ 2u]w4o06UI ϋ<7Ɨ8pġC8kinFݠ5rtMozSgii+LvJû"I;` x:2| z$ :&w*baaZi:?vQ!c0TZ-N$2MSz"`|B'1mK1m#zni.-|B(4  ;ތ7:q.DFQR#Fwuy?o1 qo&U,Ri4fEV4+r˺_İ Zkh4‡~= zO I=Fu UJ4*˛B@kE?möMD^g/jg=c0,64E4M}ye&.]t*kOR$I4U/ےq,+3e6QJD)z24ˊl]PkҠ+JzZoaYi)qGQ%41DcƘCBS*a`mm-5JPp2 n!,)HT)Ɨ˲Z !R4ÇǭVKgV4]b5DA-\B4׍RZk5??oAݒoH0fǏO$@"k <=!(|K:(4>k=BǗR O} mZJ ?`8o,Eآ4:ږ|ϛQNk>//;˗/[j0٦i"uCz+J?ݠ" = 0 =.e]'?ipÇoxiA4MU6S!BCW+\d|if._Ԝpa^c0MڟԤR\pa@_K>1o}Km#MSyZR$\ו4@^QanIȽ ch1==~oKKDQBb ٙ 9AD/ys|/\,k'U+++>NEKe-?~vՕ+Wn8ӽTVr?yRʲ8'NTU8M)p3VnDR]^(~ U`,[K75e MSlllR*QtJ۶/>яqKO:}V!w?"ػ VeK)KW^mNNN.jITRʠ!qTkeeǚe\۶kaTƑVASkm),dax@WlW 00 IeYhXXXRYJ%LNNlbmmM_VA$a=zڵkW6[(kj@@`6(jiNh\պp$tDgaIjx5May2:z<ˏkY&''133^/| zee%k6˝NR^c *^un8NJQj%s0$IWSd/:3V%)FN fiz9j5|_BU׮]`C`nxiv UC0 $0 0|$ l4իWqA @p滛"2¤x^X$7T*mt]T*`jj 簼 5vvڅ ^ZhubPgV ;K84@1c C@& u5ZǎBNLL`yyh4f},ENry4$Ce:tN?^8+30c(VyIlW2Tpcd/Ç01h`F@C4MJ)'MSC!t\jUtܽ 07ackU J}jWY7TIQÐPR]%%=\nB4M0 z+DRIonnvx'yRL|+O`0 aX\\ߟ//NR^Zkemxi|[©Smi}/ `CtEϊہz@&F6ЅvQ>W2 t,h4MUSi@uvӹ9µkPJϋ~O_BJ)&B)~O=,KvmQ'qG }{3kJ3ztH-Ys Q2z$ Ug1* HJiW1:FFԗ@U qD@gRBz>,!ȼ"i0 C)lR iJ:[_>9p~WKt IRrYLMM9/lTիW7 j\лu^ڒAr^huF # r6;>v>z>m'/]+2kӆa)ejf8NdYVbvhYm;vFݶ8R,Jrss `3Iø"k8 +GŸhwRY$ܮcuv<! #鐅%G71!yb!Da(@67QLޙD1`d`(xCwcG5w{_^p;A#Q 8x"{I :^JW!!l?dJv.=Xk1Kg10(Η`F+ڐM ɶ'nA z#cH5HeԔC#1[`$NFt:1@.عEu .]#!e2C@6""r{e$.yD.^mvw#CM6(xoMW[g`ߋS {q!HBV>vE=$1/c K0 L!qiANO\ n/@Li}Z%Cm`h'0-U;2x`H7C&1zIB #Ej!?bTI1tctm);I9L-j@H)K߆1s"0z-Togq<Hir3Z4\$`";훰!3$9&#Bv]1Ɲn0XHU%cND"J#f9&1#Ë`IDATC#%mȀ 9s2H*跔;t}bIm`&RPDč:>@ C}ɓJ~Lјn 9tLhz]s]1b$Jl.$p @(#0bNlI1I.&A ;dt<#CVNRbƮJ 7N#74' ~ rz|1@;TOeII`ӵr{IQWCXf]'BxPd=girc>S4w}N ǢtF16^0RA[ZҾE^Cof/ia1tE|Wnd<`"R$LrSI#n-FnIqU }DqUE|UWW7)`HE]/*nG 5`$-|*n'\Qx{M'haT+'cc4vv#G7AB#aH HȆTŎ%0I%rŮ3蝋9?p"(#fGk>R4=@11C<]C )OqC*&5-߹ytSG`'-FjFF*sC˽>F&;1RyI .<08V#:wH: azFA˥cץ8RytKGE'$bC/ږTI( :TbTc$%QQ6{nJ`x#' pLƎU?&XXHM!RbpU (5bH=xdNV7}^ ]STeܾ>Ac܀R&t#r1s8S4+Ɛ~OdQcFP@ZeBۙAZbK&O_p1I@ ;Rb,>'OAmC.A 37Ni1t47tE;=6b1KXے-^<y[1@jz'? $75ou=M@CgD mܰ#x@0|.[N{ kP 27<Ux5sTp +nU-d 3ߖ.J2{)8^AB((ˁ fZ&.\P4EU?Ne n@:~{k>}l]uڷy$DMn*G,sRDcщ'__IBhoRT{F75|T,oUϫ7Y>۶xg׊n9BDL.zTEΜ9cOOO[~avEsv{bccq u) m\tn`y^\8ѤZo@20oDS>E!AP[x¾L[|B*o:XIENDB` Node-path: trunk/prototype/data/images/door.jpg Node-kind: file Node-action: change Text-content-length: 39617 Text-content-md5: fc867a5317fda17879d420aebd5a82e5 Content-length: 39617 JFIFHHCreated with The GIMPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"H!1"AQa2qB#3Rr$b4C%SsDc&1!QA ?mp¥(NQCeE2S̔\VfejíiG$TLWM &NkƽIEr42J֡ *.*6Us]j91#殘 ( M<1..x954²p2)GrE#4xDf,` ZҞ*[ sSؓ #)SΓFIP3ZvNUPN!@Z^ǻnE#jnHKC8*FnVݠo$A!*X99.UrXTtgn1pWa!G T1]+򉺻[P&+h/H b C565ɭ1^ EU梴dQE HLR5,A]]5,f x&jAr(Eu4VLCd4\ j#'a5URԑymE V@ب*EDƹy⃻zTS-AbqEp3] Cw55cA₂f$w$PrJY)&Em]#1ZZ*"j[j`WqSW ]QW@殳ccQdq\h:T 榬@㊑^َSHqҥTXg4\psֈ(@sFJ$G 1j,QҀN>&CV3aBh׵H&*6 \TJ PԒ2MPkx0k?f1l}+Yg 285̹҇5%ՌV W?ZJ[V;t84xb@ һgGS^[^? jZK$!r>n}9*W¾IS.<?zkږ"%l`tYDMNIc#-gCk^^æ1H!K(l8T2GY m!ڋǽ>AڭPU#@Y#։j p|Lڗ|\xT(mFq@s^pP&k3FOux /"fiדs1Z/^0eUP5ՅOupEL*U8XE.帩lD\gQQqQLbPbdrhیWeT-(E58TQt55>ӁңCpj9fcҮ u8"dPDPBS^(00hLy41] LQ1¹\+4E X{kjx暟Xb?꛰ESjPm4k$E>zWPgZ=hQ.scpVRɆr+#>#Y mfy3B֯C~6X=08+JdN2xֶy;X8 (zPJHQp+g{K&Ǖl5Ȯڜ9;/hnQT3eǝ}A*J\m_CAzJIfDFc>[(ѮtS] G ]Q@]*A*#⥰8CRir_+ō 59@9{A#9RGJ>ޟJ%"3PWOь5!jy5 ׷rp0hނ`Fy4e*=*jAl<@0Hj(F3֣ T`dEf^TAǟ#WpHZz{FlSMqSA$g51^TENsFX) RO>A1һPWu@׶BBf {vW{j=ѧjښb&a.zTLb+>dSLllv\/4@|SRA(>Te>䘎Vl D5W2vM:n3Y 482-N"4TcwL)Dナf(pzS,rUHm|NAqw_K' 5|fԌ?rHO` {+{ Rf'z{ wo@ rxq\f3h->"9&}<#V)1Ѹ־%&;q>@{Π$`y'1XZI,Uɯ\ng9ڧyߋ`ۑ[o JF8"!@惥NIE=++Ċ0H:wp;YKZ tv %.J{9øAClWo]'ΝQO9ityNgޚMZL5*DPKaZynFF=Bh_ .tUdZX1Ch##F*v}+C%*WT3]cʡҮIo>Ǖ4S@}* R|Ҫ;<3VO{O:UbEOoY]6SI_j\sOIhAPs!jꌞSnb) z#4Q׌D|uٯwg$d" &ɣccD |kdM]NK/&9:azDQ'X 9NiW'W ^l-Ѻ^6D:J6G҄L<]hݮ4I hPC2[zmh쬁 y `v.A_EmWkl!$,= Pk;ډ0Y+^Kڹv7Z.rkjhQ~7A{HP8^ښ蹕Oi/ޓ:׉N)=U3M ⧓W&c5>G5Ɛֵ5U3v~P[<퉘~cַVq[sOQI̍G\7i _FҗyQCn5b봀O?־k_3v^bF !ҾvOb2_NV4A]j=6ʠ9Sl/*eT-XdMQP:ldci *zc.b"xҲ>AmT}+v[peւ(rМfD4H?zD*2pW$+ɮ:ZHCtb>WbN9cZqĀՅ)ZpkstK6` 힕sԺW;km1zm:}=^f9Ѿ&~"EZZOr}3[/W:u ¹ֈo30=_Uke"Cfs|刡+?O,GȏjlKdvz:}S']M^~Ut=s7NsX& 锆&o\~ugȘd>EՍ7xX(=+o0 \Tk}.fRZ8|󩾻nÂ?:884Ʈ7xi$= ߚFmC`O1Yƾ5̭Սbѵ )IeLQ-Ԛ~ztXsR3jYii"bk=Te:]%?"isv6C `6$46rPT9ЎUoZ}) `zWeG+U@,}Mqnj >UB#D "b5c (uI~۔`|*,H5gL]fl}jӷ5InWkV{Y "E!~:亏Z$asN_'W_I-RREWRX%}IOּq3 l6vⲅU*329LvN]YWܧ'}UXlr*9vG^׵ cPY8k7jZn𵮜rC 6%d!T/eĎf^ւvZdlqMi ' ]y՗bJbjg&%H.+idf 7CTNC5V%hڣ?\UlG@L5;{TEU-"D1^žx1A1~3ָb˃)wV19Hn wpGj7OZ'}-l幫4eq*6}i{Knd sw c5kPޚK@V Yh-rJdoG^eS 7+}NẼ 9rڢTU\l6~ [v1X,NkftA 1SqlsһyUG^4MV\1 }E49<6.*G"" 9OU;%ǝ:bV5kH97†94TE򦚭 Fjt)jf8*}+m4$=]X bt1 > ].tyY;I +JeV1'Ӛߛ1l/fu;].Tb m2z֒{iq3F TփOeb?_f5{6Xeh&S kkMi -u9~FnqҾ{Im,f}ݤ鏘A :)VJjf w"'q>DTO~h9AYui8d8$fփu1>Q"'M%^iqSBKY%n\^G*%C m[(z:mAQ5Xtr`c,g}If()6ie yTʳb8ah &)qSثr<⥱OWU{B¢U?W@eh%O@)h&$ bbl3P18i؄ jՍU(t9&'"d`rQkZ,.6.$S(0 5ut\#֭.xU)Ym<{UA$+LV-WʂLv°A6@F6y7:S0ٱnA#ݶ2);tYN(NHXKl#<YA[΍xȥ N\vX<1CҒ` a'O]MTt#!=eɡ q(ï`WjcSPNifpk)-x*$fYb8RJz5F1]s:=W k*)3P Sif4P{,樓2' *%ɡ@$P"Yu_kH? o䏙¿ս;?!ڋ'xMF?VE[_s#Hpjl6]Kv4k/fDbm^jֺn~UJ@Emx>Ո)PGSH17АIEHぃJ5ڽ'aJP桪H^L\X &)*q\K ۷6b.$w|U]Y^v6U6 d4Yotf|5 к I_JMsqw65K3B2qMHtXnn.f v 7pa~3X9"62?.?{33)[{wrC9?bljPqX.ÐsO};Df[1E(Td v[ -?GUph*.[S՞E;#;cSAhFKE˿Ht:^j?6oqփ4Q4<`=p)#yg&^ BPxvQx W y(=ڢsIj`x=vF+Sk|F|ժ[QG;U'QɟsEY {W՘u\ĨxKCYR*9 be1}Y)Z!T RT$pLlrۍu<sh6c؊~v*@!(O:j؂<%O9ܜtV?4UR9:q *iD~ X^{8|ra+SWDp~յ`ӆb )o@hkչ+Pٰ'k`ǟN/H\[ڲ(^jhhMNRZU,I5Qd3L1T#8z WQ;Ij6Y\ܙ-@8ѭĮM_gWAGr۩<^ߖvr:6&ɼֵRlIȒAw7\hu];RUOiAYSSL21VZ8/J%ggk9yve=j?(>_*xLdtXa~>| B#6%HxǮ*(kTwOZX?(>:wb܅L'L8#i/.8Aj;97n RyЧnPƓɉH< >J۸' yS!K#!F-$,ܱZw(4NXBٸq1Y-1JF]>PU}$QP21ቭ+-&r$MF1uViy-nN* †K%817ڽ|`U!d9)NrsWh ß:Z&G<40TwUē8#5bkRk&$oH֟Y-!Ď _ T :giUٔ?hd# bq$l0s)'`7sXvXbsfԱ1@dcUUj-_ 8*|qVIumsϽLLb]<3*Ob@W