I've been wanting to make explosive arrows, but couldn't get them to work. After mucking about in the code a bit, I found that it's because only spell-bullets (102) get checked for detonation and suchlike, but if you change the type 13 archs to 102, they aren't ammo any more and you can't fire them in the first place. So, I came up with this. It's rather hackish and probably still has a bug or two left in it, but it doesn't double-remove_ob() any more, at least. If the other_arch field of the shot being fired is blank, it proceeds normally; otherwise, it spawns one of those archetypes and removes the original projectile. Thus, by setting an arrow with, say, other_arch firebullet, you'll be shooting fireballs instead of arrows. And the arrows will be unrecoverable, although this may not always be desireable. The new arch inherits hp/maxhp/dam_modifier/range from the parent ammo, if it has them. There's also a check to make sure that hp doesn't get overwritten by the original value of dam; since we won't be retrieving the missile afterwards, this doesn't really matter. Lastly, there's a check at the end that calls move_bullet rather than move_arrow if the itemtype isn't ARROW - using move_arrow results in odd bugs when firing at point blank range. Oh, and there's no check to see if arch_to_object worked. This is probably very unsafe. I'm not sure if this will work for cone/beam weapons, I haven't looked at the code for those much yet, but something in fire_bow based on (or calling) drop_cone and move_cone will probably be necessary. A sample archetype: Object bolt_fb race crossbow bolts name bolt title Firey Blast type 13 hp 8 maxhp 4 dam_modifier 4 range 10 other_arch firebullet face bolt.101 animation firebullet is_animated 0 is_turnable 1 nrof 1 weight 50 value 2 material 2 food 10 dam 3 wc 2 editable 1024 attacktype 5 name_pl bolts client_type 165 editor_folder arch/weapon/bow end $ diff player.c player.orig.c 1471c1471 < object *left, *bow, *tmp; --- > object *left, *bow; 1540,1566d1539 < < if(arrow->other_arch) { < tmp = arch_to_object(arrow->other_arch); < if(arrow->range) < tmp->range = arrow->range; < if(arrow->stats.hp) < tmp->stats.hp = arrow->stats.hp; < if(arrow->stats.maxhp) < tmp->stats.maxhp = arrow->stats.maxhp; < if(arrow->dam_modifier) < tmp->dam_modifier = arrow->dam_modifier; < free_object(arrow); < arrow = tmp; < } < 1582,1583c1555 < if(!arrow->stats.hp) /* hack so that hp (duration) doesn't get overwritten */ < arrow->stats.hp = arrow->stats.dam; --- > arrow->stats.hp = arrow->stats.dam; 1634,1640c1606,1607 < if (!was_destroyed(arrow, tag)) { < if(arrow->type == ARROW) { < move_arrow(arrow); < } else { < move_bullet(arrow); < } < } --- > if (!was_destroyed(arrow, tag)) > move_arrow(arrow); _______________________________________________ crossfire-devel mailing list crossfire-devel at lists.real-time.com https://mailman.real-time.com/mailman/listinfo/crossfire-devel