--- deliantra/server/server/time.C 2007/04/21 22:01:57 1.44 +++ deliantra/server/server/time.C 2007/04/22 13:06:45 1.45 @@ -89,9 +89,43 @@ op->destroy (); } -static void -generate_monster_tail (object *gen, object *op) +void +generate_monster (object *gen) { + if (!gen->map) + return; + + if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1)) + return; + + object *op; + + if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN)) + { + // either copy one item form the inventory... + if (!gen->inv) + return; + + // first select one item from the inventory + int index = 0; + for (object *tmp = gen->inv; tmp; tmp = tmp->below) + if (!rndm (++index)) + op = tmp; + + op = object_create_clone (op); + + CLEAR_FLAG (op, FLAG_IS_A_TEMPLATE); + unflag_inv (op, FLAG_IS_A_TEMPLATE); + } + else + { + // ...or use other_arch + if (archetype *at = gen->other_arch) + op = arch_to_object (at); + else + return; + } + op->expand_tail (); int i = find_free_spot (op, gen->map, gen->x, gen->y, 1, 9); @@ -112,53 +146,6 @@ op->destroy (); } -/* Will generate a monster according to content - * of generator. - */ -static void -generate_monster_inv (object *gen) -{ - if (!gen->inv) - return; - - /* First count number of objects in inv */ - int index = 0; - object *op; - for (object *tmp = gen->inv; tmp; tmp = tmp->below) - if (!rndm (++index)) - op = tmp; - - op = object_create_clone (op); - - CLEAR_FLAG (op, FLAG_IS_A_TEMPLATE); - unflag_inv (op, FLAG_IS_A_TEMPLATE); - - generate_monster_tail (gen, op); -} - -static void -generate_monster_arch (object *gen) -{ - if (archetype *at = gen->other_arch) - generate_monster_tail (gen, arch_to_object (at)); -} - -void -generate_monster (object *gen) -{ - if (!gen->map) - return; - - if (GENERATE_SPEED (gen) && rndm (0, GENERATE_SPEED (gen) - 1)) - return; - - if (QUERY_FLAG (gen, FLAG_CONTENT_ON_GEN)) - generate_monster_inv (gen); - else - generate_monster_arch (gen); - -} - void remove_force (object *op) {