From: <js...@us...> - 2012-08-23 01:11:36
|
Revision: 7134 http://exult.svn.sourceforge.net/exult/?rev=7134&view=rev Author: jsf Date: 2012-08-23 01:11:25 +0000 (Thu, 23 Aug 2012) Log Message: ----------- First attempt at notifying schedules (Bake_schedule) when an object is deleted. Modified Paths: -------------- exult/trunk/actors.cc exult/trunk/combat.cc exult/trunk/objs/Makefile.am exult/trunk/objs/objs.cc exult/trunk/objs/objs.h exult/trunk/schedule.cc exult/trunk/schedule.h Added Paths: ----------- exult/trunk/objs/objclient.cc exult/trunk/objs/objclient.h Modified: exult/trunk/actors.cc =================================================================== --- exult/trunk/actors.cc 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/actors.cc 2012-08-23 01:11:25 UTC (rev 7134) @@ -1275,7 +1275,7 @@ ) { if (schedule) - schedule->notify_object_gone(obj); + schedule->object_gone(obj); } /* Modified: exult/trunk/combat.cc =================================================================== --- exult/trunk/combat.cc 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/combat.cc 2012-08-23 01:11:25 UTC (rev 7134) @@ -22,12 +22,12 @@ # include <config.h> #endif +#include "actors.h" #include "combat.h" #include "combat_opts.h" #include "gamewin.h" #include "gameclk.h" #include "gamemap.h" -#include "actors.h" #include "paths.h" #include "Astar.h" #include "actions.h" Modified: exult/trunk/objs/Makefile.am =================================================================== --- exult/trunk/objs/Makefile.am 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/objs/Makefile.am 2012-08-23 01:11:25 UTC (rev 7134) @@ -26,6 +26,8 @@ iregobjs.h \ mappatch.cc \ mappatch.h \ + objclient.cc \ + objclient.h \ objiter.h \ objiter.cc \ objlist.h \ Added: exult/trunk/objs/objclient.cc =================================================================== --- exult/trunk/objs/objclient.cc (rev 0) +++ exult/trunk/objs/objclient.cc 2012-08-23 01:11:25 UTC (rev 7134) @@ -0,0 +1,51 @@ +/* + * objclient.cc - Game objects that have been removed, but need deleting. + * + * Copyright (C) 2000-2012 The Exult Team + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <vector> +#include "objs.h" +#include "objclient.h" + +/* + * Remove all clients. + */ +void Object_client::remove_clients() { + for (Game_object_vector::iterator it = objs.begin(); + it != objs.end(); ++it) + (*it)->remove_client(this); + objs.clear(); +} + +/* + * An object should call this when it's about to be removed. + */ +void Object_client::object_gone(Game_object *obj) { + for (Game_object_vector::iterator it = objs.begin(); + it != objs.end(); ++it) { + if ((*it) == obj) { + objs.erase(it); + notify_object_gone(obj); + return; + } + } +} Property changes on: exult/trunk/objs/objclient.cc ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: exult/trunk/objs/objclient.h =================================================================== --- exult/trunk/objs/objclient.h (rev 0) +++ exult/trunk/objs/objclient.h 2012-08-23 01:11:25 UTC (rev 7134) @@ -0,0 +1,42 @@ +/* + * objclient.h - Game objects that have been removed, but need deleting. + * + * Copyright (C) 2000-2012 The Exult Team + * + * 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 OBJCLIENT_H +#define OBJCLIENT_H 1 + +class Game_object; +/* + * A class (ie, Schedule) that needs to be notified when an object + * is about to be deleted. + */ +class Object_client { + Game_object_vector objs; +protected: + // Notify that schedule's obj. has been moved or deleted. + virtual void notify_object_gone(Game_object *obj) = 0; + void add_client(Game_object *obj) { + if (obj->add_client(this)) + objs.push_back(obj); + } + void remove_clients(); +public: + void object_gone(Game_object *obj); +}; +#endif /* OBJCLIENT_H */ Property changes on: exult/trunk/objs/objclient.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Modified: exult/trunk/objs/objs.cc =================================================================== --- exult/trunk/objs/objs.cc 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/objs/objs.cc 2012-08-23 01:11:25 UTC (rev 7134) @@ -24,6 +24,7 @@ #endif #include "objs.h" +#include "objclient.h" #include "chunks.h" #include "objiter.h" #include "egg.h" @@ -640,6 +641,35 @@ } /* + * Add/remove a client. + */ +bool Game_object::add_client + ( + Object_client *c + ) { + for (vector<Object_client*>::iterator it = clients.begin(); + it != clients.end(); ++it) + if ((*it) == c) + return false; + clients.push_back(c); + return true; + } + +void Game_object::remove_client + ( + Object_client *c + ) + { + for (vector<Object_client*>::iterator it = clients.begin(); + it != clients.end(); ++it) + if ((*it) == c) + { + clients.erase(it); + return; + } + } + +/* * Change the frame and set to repaint areas. */ @@ -1206,7 +1236,14 @@ if (chunk) chunk->remove(this); if (!nodel) + { + for (vector<Object_client*>::iterator it = + clients.begin(); it != clients.end(); ++it) { + (*it)->object_gone(this); + } + clients.clear(); gwin->delete_object(this); + } } /* Modified: exult/trunk/objs/objs.h =================================================================== --- exult/trunk/objs/objs.h 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/objs/objs.h 2012-08-23 01:11:25 UTC (rev 7134) @@ -48,6 +48,7 @@ class Vga_file; class DataSource; class Game_map; +class Object_client; template<class T> class T_Object_list; @@ -82,6 +83,7 @@ // this can be rendered. Game_object_set dependors; // Objects which must be painted after. static unsigned char rotate[8]; // For getting rotated frame #. + std::vector <Object_client *> clients; // Notify when deleted. public: uint32 render_seq; // Render sequence #. public: @@ -171,6 +173,8 @@ virtual void move(int newtx, int newty, int newlift, int newmap = -1); void move(Tile_coord t, int newmap = -1) { move(t.tx, t.ty, t.tz, newmap); } + bool add_client(Object_client *c); + void remove_client(Object_client *c); void change_frame(int frnum); // Change frame & set to repaint. // Swap positions. int swap_positions(Game_object *obj2); Modified: exult/trunk/schedule.cc =================================================================== --- exult/trunk/schedule.cc 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/schedule.cc 2012-08-23 01:11:25 UTC (rev 7134) @@ -23,8 +23,8 @@ #endif #include "SDL_timer.h" +#include "actors.h" #include "schedule.h" -#include "actors.h" #include "Zombie.h" #include "gamewin.h" #include "gameclk.h" @@ -3252,6 +3252,7 @@ if (!baking_dough.empty()) // found dough { dough_in_oven = baking_dough[0]; + add_client(dough_in_oven); state = remove_from_oven; break; } @@ -3261,12 +3262,14 @@ oven = stove; if (oven) { + add_client(oven); Game_object_vector food; Tile_coord Opos = oven->get_tile(); npc->find_nearby(food, Opos, 377, 2, 0, 51, c_any_framenum); if (!food.empty()) // found food { dough_in_oven = food[0]; + add_client(dough_in_oven); state = remove_from_oven; break; } @@ -3286,6 +3289,7 @@ if (!leftovers.empty()) // found dough { dough = leftovers[0]; + add_client(dough); state = make_dough; delay = 0; Actor_action *pact = Path_walking_actor_action::create_path( @@ -3310,6 +3314,7 @@ int nr = rand()%items.size(); flourbag = items[nr]; + add_client(flourbag); Tile_coord tpos = flourbag->get_tile(); Actor_action *pact = Path_walking_actor_action::create_path( @@ -3379,7 +3384,7 @@ state = to_flour; break; } - + add_client(worktable); // Find where to put dough. Rectangle foot = worktable->get_footprint(); Shape_info& info = worktable->get_info(); @@ -3399,6 +3404,7 @@ dough = new Ireg_game_object(dough_shp, 16, 0, 0); else dough = new Ireg_game_object(dough_shp, 0, 0, 0); + add_client(dough); dough->set_quality(50); npc->set_action(new Sequence_actor_action(pact, new Pickup_actor_action(dough,tablepos,250))); @@ -3469,7 +3475,7 @@ state = to_table; break; } - + add_client(oven); if (dough_in_oven->get_shapenum() != 377){ gwin->add_dirty(dough_in_oven); dough_in_oven->set_shape(377); @@ -3533,6 +3539,7 @@ state = find_leftovers; break; } + add_client(displaytable); Rectangle r = displaytable->get_footprint(); Perimeter p(r); // Find spot adjacent to table. @@ -3622,7 +3629,7 @@ state = find_leftovers; break; } - + add_client(oven); Tile_coord tpos = dough->get_tile(); Actor_action *pact = Path_walking_actor_action::create_path( npcpos, tpos, cost2); @@ -3659,7 +3666,7 @@ state = to_table; break; } - + add_client(oven); Tile_coord tpos = oven->get_tile() + Tile_coord(1, 1, 0); Actor_action *pact = Path_walking_actor_action::create_path( @@ -3704,11 +3711,11 @@ void Bake_schedule::ending(int new_type) { + remove_clients(); if (dough) { dough->remove_this(); dough = 0; } - if (dough_in_oven) { dough_in_oven->remove_this(); dough_in_oven = 0; @@ -3720,9 +3727,17 @@ */ void Bake_schedule::notify_object_gone(Game_object *obj) { - if (obj == dough) // Someone stole the dough! + if (obj == oven) + oven = 0; + else if (obj == worktable) + worktable = 0; + else if (obj == displaytable) + displaytable = 0; + else if (obj == flourbag) + flourbag = 0; + else if (obj == dough) // Someone stole the dough! dough = 0; - if (obj == dough_in_oven) + else if (obj == dough_in_oven) dough_in_oven = 0; } Modified: exult/trunk/schedule.h =================================================================== --- exult/trunk/schedule.h 2012-08-18 17:44:12 UTC (rev 7133) +++ exult/trunk/schedule.h 2012-08-23 01:11:25 UTC (rev 7134) @@ -23,6 +23,7 @@ #include "tiles.h" #include "singles.h" +#include "objclient.h" #include <vector> #ifdef WIN32 @@ -41,7 +42,7 @@ /* * A Schedule controls the NPC it is assigned to. */ -class Schedule : public Game_singletons +class Schedule : public Game_singletons, public Object_client { protected: Actor *npc; // Who this controls. @@ -96,14 +97,14 @@ // Set where to sleep. virtual void set_bed(Game_object *b) { } - // Notify that schedule's obj. has - // been moved. - virtual void notify_object_gone(Game_object *obj) - { } // For Usecode intrinsic. virtual int get_actual_type(Actor *npc); // Look for foes. bool seek_foes(); + /* For Object_client: +++++ Override in sub-classes. */ + // Notify that schedule's obj. has been moved or deleted. + virtual void notify_object_gone(Game_object *obj) + { } }; /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |