From: "Surgeon" <webremedies@CA.INTER.NET>
> I am currently in the process of "trying" to make one of my first
> snippets for the CircleMUD community, but running into a bit of problems
in
> terms of cycling an object for more than one char. For
> example (in relation to what's below) if I was to create a couch, with
> an infinite player limit and infinite weight restriction how would I
> properly go about cycling that object for ALL the characters on it. This
is
> what I am currently tampering with now.
>
Apart from the fact that I've never heard of 'cycling' in this sense,
I think you're on the right track.
struct obj_data {
...
struct rest_object_data *furniture; /* object can be sat in */
...
};
Set this to NULL for all non-furniture.
Easy accessor macros:
OBJ_IS_FURNITURE(obj) (obj->furniture != NULL)
OBJ_IS_SAT_IN_BY(obj) (obj->furniture ? obj->furniture->sat_in_by : NULL)
> struct rest_object_data {
> long weight_capacity; /* how much weight can object hold -1 infinite*/
> int player_capacity; /* how many players can use this object -1 " */
+ int current_chars; /* how many there now [1]*/
+ long current_weight; /* how much is there now [1]*/
> int regen_bonus; /* bonus regen per tick */
> int rest_type[4]; /* POS's: sleep, rest, kneel, sit */
I'd use
bitvector_t rest_type;
here. All you need is yes/no, anyhow. And you could use those 12 bytes
better elsewhere.
> struct char_data *rested_on_by; /* This is where I need assistance */
Change this to use your example below:
struct example *sat_in_by;
> struct rest_object_data *next;
Are you making all rest objects sit in their own list ? If not
(which I recommend), ditch this.
> };
>
> Two problems I can forsee:
>
> One: I am planning on writing extra bits to the object files
obviously
> for all fields, rest_type[1] being sleep position, 1 (can be slept on), 0
if
> not. Just so as to provide a way for builders to make furniture restable
> upon in some ways while restricting others.
I'd suggest you add a new section in your object files for this
(much the same way affects are saved;
-8<--
A
<location> <value>
-8<--)
I'd save it like:
R
<max weight> <max people> <regen rate> <bitvector>
> Two: I am somewhat left blinded as to how I would go about cycling
> ONE object for the amount of chars that are currently resting on it.
Would
> I have to create a whole new structure all together similar to the
> below inorder to succesfully shuffle through the chars?
>
> struct example {
> struct char_data *rested_on_by;
> struct example *next;
> };
>
> And then replace the first instance of *rested_on_by (at the top) with:
> struct example *resting_plist;
>
> And then cycle through example independantly?
>
I'd do that. You might also set up a pointer in the char_data structure:
struct obj_data *sitting_in; /* Current restingplace */
This would make it easier to check for regen bonuses in limits.c
Welcor
[1] As I see it, you have two options, when it concerns weight and
number of chars:
1. count people, carried + personal weight whenever someone sits
on the object. This option will cost some processing, depending
on how many people are currently sitting in/on the object.
The processing needed would be unnoticable when few people
are using the same beds.
2. Keep a count of weight and people, and change it when people
stand/rest/drop an item/get an item/eat an item/etc.
This option will demand many changes in the code, but won't
be very hard on processing power, and those two extra values
would be unnoticable on the memory footprint.
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT