1 | /* |
1 | /* |
2 | * static char *rcsid_alchemy_c = |
2 | * static char *rcsid_alchemy_c = |
3 | * "$Id: alchemy.C,v 1.4 2006/08/29 08:01:37 root Exp $"; |
3 | * "$Id: alchemy.C,v 1.5 2006/09/03 00:18:42 root Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /* |
6 | /* |
7 | CrossFire, A Multiplayer game for X-windows |
7 | CrossFire, A Multiplayer game for X-windows |
8 | |
8 | |
… | |
… | |
224 | |
224 | |
225 | while(tmp) { |
225 | while(tmp) { |
226 | tval=0; |
226 | tval=0; |
227 | strcpy(name, tmp->name); |
227 | strcpy(name, tmp->name); |
228 | if (tmp->title) |
228 | if (tmp->title) |
229 | sprintf(name, "%s %s", tmp->name, tmp->title); |
229 | sprintf (name, "%s %s", &tmp->name, &tmp->title); |
230 | tval = (strtoint(name) * (tmp->nrof?tmp->nrof:1)); |
230 | tval = (strtoint(name) * (tmp->nrof?tmp->nrof:1)); |
231 | #ifdef ALCHEMY_DEBUG |
231 | #ifdef ALCHEMY_DEBUG |
232 | LOG(llevDebug,"Got ingredient %d %s(%d)\n", tmp->nrof?tmp->nrof:1, |
232 | LOG(llevDebug,"Got ingredient %d %s(%d)\n", tmp->nrof?tmp->nrof:1, |
233 | name, tval); |
233 | name, tval); |
234 | #endif |
234 | #endif |
… | |
… | |
315 | /* adj lvl, nrof on caster level */ |
315 | /* adj lvl, nrof on caster level */ |
316 | adjust_product(item, ability, rp->yield?(rp->yield*batches):batches); |
316 | adjust_product(item, ability, rp->yield?(rp->yield*batches):batches); |
317 | if(!item->env && (item=insert_ob_in_ob(item,cauldron)) == NULL) { |
317 | if(!item->env && (item=insert_ob_in_ob(item,cauldron)) == NULL) { |
318 | new_draw_info(NDI_UNIQUE, 0,caster,"Nothing happened."); |
318 | new_draw_info(NDI_UNIQUE, 0,caster,"Nothing happened."); |
319 | /* new_draw_info_format(NDI_UNIQUE, 0,caster, |
319 | /* new_draw_info_format(NDI_UNIQUE, 0,caster, |
320 | "Your spell causes the %s to explode!",cauldron->name); */ |
320 | "Your spell causes the %s to explode!",&cauldron->name); */ |
321 | /* kaboom_cauldron(); */ |
321 | /* kaboom_cauldron(); */ |
322 | } else { |
322 | } else { |
323 | new_draw_info_format(NDI_UNIQUE, 0,caster, |
323 | new_draw_info_format(NDI_UNIQUE, 0,caster, |
324 | "The %s %s.",cauldron->name,cauldron_sound()); |
324 | "The %s %s.", &cauldron->name,cauldron_sound()); |
325 | } |
325 | } |
326 | } |
326 | } |
327 | return item; |
327 | return item; |
328 | } |
328 | } |
329 | |
329 | |
… | |
… | |
477 | } |
477 | } |
478 | tmp = get_archetype("rock"); |
478 | tmp = get_archetype("rock"); |
479 | tmp->weight=weight; |
479 | tmp->weight=weight; |
480 | tmp->value=0; |
480 | tmp->value=0; |
481 | tmp->material=material; |
481 | tmp->material=material; |
482 | tmp->materialname = add_string("stone"); |
482 | tmp->materialname = "stone"; |
483 | free_string(tmp->name); |
|
|
484 | tmp->name=add_string("slag"); |
483 | tmp->name="slag"; |
485 | if (tmp->name_pl) free_string(tmp->name_pl); |
|
|
486 | tmp->name_pl=add_string("slags"); |
484 | tmp->name_pl="slags"; |
487 | item=insert_ob_in_ob(tmp,cauldron); |
485 | item=insert_ob_in_ob(tmp,cauldron); |
488 | CLEAR_FLAG(tmp,FLAG_CAN_ROLL); |
486 | CLEAR_FLAG(tmp,FLAG_CAN_ROLL); |
489 | CLEAR_FLAG(tmp,FLAG_NO_PICK); |
487 | CLEAR_FLAG(tmp,FLAG_NO_PICK); |
490 | tmp->move_block = 0; |
488 | tmp->move_block = 0; |
491 | } |
489 | } |
492 | remove_contents(cauldron->inv,item); |
490 | remove_contents(cauldron->inv,item); |
493 | new_draw_info_format(NDI_UNIQUE,0,op, |
491 | new_draw_info_format(NDI_UNIQUE,0,op, |
494 | "The %s %s.",cauldron->name,cauldron_sound()); |
492 | "The %s %s.", &cauldron->name,cauldron_sound()); |
495 | return; |
493 | return; |
496 | } else if (level< 40) { /* MAKE TAINTED ITEM */ |
494 | } else if (level< 40) { /* MAKE TAINTED ITEM */ |
497 | object *tmp=NULL; |
495 | object *tmp=NULL; |
498 | |
496 | |
499 | if (!rp) |
497 | if (!rp) |
… | |
… | |
545 | case 0: |
543 | case 0: |
546 | tmp=get_archetype("bomb"); |
544 | tmp=get_archetype("bomb"); |
547 | tmp->stats.dam=random_roll(1, level, op, PREFER_LOW); |
545 | tmp->stats.dam=random_roll(1, level, op, PREFER_LOW); |
548 | tmp->stats.hp=random_roll(1, level, op, PREFER_LOW); |
546 | tmp->stats.hp=random_roll(1, level, op, PREFER_LOW); |
549 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s creates a bomb!", |
547 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s creates a bomb!", |
550 | cauldron->name); |
548 | &cauldron->name); |
551 | break; |
549 | break; |
552 | |
550 | |
553 | default: |
551 | default: |
554 | tmp=get_archetype("fireball"); |
552 | tmp=get_archetype("fireball"); |
555 | tmp->stats.dam=random_roll(1, level, op, PREFER_LOW)/5+1; |
553 | tmp->stats.dam=random_roll(1, level, op, PREFER_LOW)/5+1; |
556 | tmp->stats.hp=random_roll(1, level, op, PREFER_LOW)/10+2; |
554 | tmp->stats.hp=random_roll(1, level, op, PREFER_LOW)/10+2; |
557 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s erupts in flame!", |
555 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s erupts in flame!", |
558 | cauldron->name); |
556 | &cauldron->name); |
559 | break; |
557 | break; |
560 | } |
558 | } |
561 | tmp->x=cauldron->x,tmp->y=cauldron->y; |
559 | tmp->x=cauldron->x,tmp->y=cauldron->y; |
562 | insert_ob_in_map(tmp,op->map,NULL,0); |
560 | insert_ob_in_map(tmp,op->map,NULL,0); |
563 | return; |
561 | return; |
564 | |
562 | |
565 | } else if (level<60) { /* CREATE MONSTER */ |
563 | } else if (level<60) { /* CREATE MONSTER */ |
566 | new_draw_info_format(NDI_UNIQUE,0,op, |
564 | new_draw_info_format(NDI_UNIQUE,0,op, |
567 | "The %s %s.",cauldron->name,cauldron_sound()); |
565 | "The %s %s.",&cauldron->name,cauldron_sound()); |
568 | remove_contents(cauldron->inv,NULL); |
566 | remove_contents(cauldron->inv,NULL); |
569 | return; |
567 | return; |
570 | } else if (level<80) { /* MAJOR FIRE */ |
568 | } else if (level<80) { /* MAJOR FIRE */ |
571 | object *fb = get_archetype(SP_MED_FIREBALL); |
569 | object *fb = get_archetype(SP_MED_FIREBALL); |
572 | remove_contents(cauldron->inv,NULL); |
570 | remove_contents(cauldron->inv,NULL); |
573 | fire_arch_from_position(cauldron, cauldron,cauldron->x, cauldron->y, |
571 | fire_arch_from_position(cauldron, cauldron,cauldron->x, cauldron->y, |
574 | 0, fb); |
572 | 0, fb); |
575 | free_object(fb); |
573 | free_object(fb); |
576 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s erupts in flame!", |
574 | new_draw_info_format(NDI_UNIQUE,0,op,"The %s erupts in flame!", |
577 | cauldron->name); |
575 | &cauldron->name); |
578 | return; |
576 | return; |
579 | |
577 | |
580 | } else if (level<100) { /* WHAMMY the CAULDRON */ |
578 | } else if (level<100) { /* WHAMMY the CAULDRON */ |
581 | if(!QUERY_FLAG(cauldron,FLAG_CURSED)) |
579 | if(!QUERY_FLAG(cauldron,FLAG_CURSED)) |
582 | SET_FLAG(cauldron,FLAG_CURSED); |
580 | SET_FLAG(cauldron,FLAG_CURSED); |
… | |
… | |
584 | cauldron->magic -= random_roll(0, 4, op, PREFER_LOW); |
582 | cauldron->magic -= random_roll(0, 4, op, PREFER_LOW); |
585 | if(rndm(0, 1)) { |
583 | if(rndm(0, 1)) { |
586 | remove_contents(cauldron->inv,NULL); |
584 | remove_contents(cauldron->inv,NULL); |
587 | new_draw_info_format(NDI_UNIQUE,0,op, |
585 | new_draw_info_format(NDI_UNIQUE,0,op, |
588 | "Your %s turns darker then makes a gulping sound!", |
586 | "Your %s turns darker then makes a gulping sound!", |
589 | cauldron->name); |
587 | &cauldron->name); |
590 | } else |
588 | } else |
591 | new_draw_info_format(NDI_UNIQUE,0,op, |
589 | new_draw_info_format(NDI_UNIQUE,0,op, |
592 | "Your %s becomes darker.",cauldron->name); |
590 | "Your %s becomes darker.",&cauldron->name); |
593 | return; |
591 | return; |
594 | |
592 | |
595 | } else if (level<110) { /* SUMMON EVIL MONSTERS */ |
593 | } else if (level<110) { /* SUMMON EVIL MONSTERS */ |
596 | object *tmp=get_random_mon(level/5); |
594 | object *tmp=get_random_mon(level/5); |
597 | |
595 | |
… | |
… | |
599 | if(!tmp) |
597 | if(!tmp) |
600 | alchemy_failure_effect(op,cauldron,rp,level); |
598 | alchemy_failure_effect(op,cauldron,rp,level); |
601 | else if(summon_hostile_monsters(cauldron, random_roll(1, 10, op, PREFER_LOW), tmp->arch->name)) |
599 | else if(summon_hostile_monsters(cauldron, random_roll(1, 10, op, PREFER_LOW), tmp->arch->name)) |
602 | new_draw_info_format(NDI_UNIQUE, 0,op, |
600 | new_draw_info_format(NDI_UNIQUE, 0,op, |
603 | "The %s %s and then pours forth monsters!", |
601 | "The %s %s and then pours forth monsters!", |
604 | cauldron->name,cauldron_sound()); |
602 | &cauldron->name,cauldron_sound()); |
605 | return; |
603 | return; |
606 | |
604 | |
607 | } else if (level<150) { /* COMBO EFFECT */ |
605 | } else if (level<150) { /* COMBO EFFECT */ |
608 | int roll = rndm(1, 3); |
606 | int roll = rndm(1, 3); |
609 | while(roll) { |
607 | while(roll) { |
… | |
… | |
621 | if(rp && (tmp=get_archetype(rp->arch_name[RANDOM()%rp->arch_names]))) { |
619 | if(rp && (tmp=get_archetype(rp->arch_name[RANDOM()%rp->arch_names]))) { |
622 | generate_artifact(tmp,random_roll(1, op->level/2+1, op, PREFER_HIGH)+1); |
620 | generate_artifact(tmp,random_roll(1, op->level/2+1, op, PREFER_HIGH)+1); |
623 | if((tmp=insert_ob_in_ob(tmp,cauldron))) { |
621 | if((tmp=insert_ob_in_ob(tmp,cauldron))) { |
624 | remove_contents(cauldron->inv,tmp); |
622 | remove_contents(cauldron->inv,tmp); |
625 | new_draw_info_format(NDI_UNIQUE, 0,op, |
623 | new_draw_info_format(NDI_UNIQUE, 0,op, |
626 | "The %s %s.",cauldron->name,cauldron_sound()); |
624 | "The %s %s.",&cauldron->name,cauldron_sound()); |
627 | } |
625 | } |
628 | } |
626 | } |
629 | return; |
627 | return; |
630 | } else { /* MANA STORM - watch out!! */ |
628 | } else { /* MANA STORM - watch out!! */ |
631 | object *tmp = get_archetype(LOOSE_MANA); |
629 | object *tmp = get_archetype(LOOSE_MANA); |
… | |
… | |
688 | * Thus the backfire is worse. Also, more ingredients |
686 | * Thus the backfire is worse. Also, more ingredients |
689 | * means we are attempting a more powerfull potion, |
687 | * means we are attempting a more powerfull potion, |
690 | * and thus the backfire will be worse. */ |
688 | * and thus the backfire will be worse. */ |
691 | for(item=cauldron->inv;item;item=item->below) { |
689 | for(item=cauldron->inv;item;item=item->below) { |
692 | strcpy(name,item->name); |
690 | strcpy(name,item->name); |
693 | if(item->title) sprintf(name,"%s %s",item->name,item->title); |
691 | if(item->title) sprintf(name,"%s %s", &item->name, &item->title); |
694 | danger += (strtoint(name)/1000) + 3; |
692 | danger += (strtoint(name)/1000) + 3; |
695 | nrofi++; |
693 | nrofi++; |
696 | } |
694 | } |
697 | if (rp == NULL) |
695 | if (rp == NULL) |
698 | danger += 110; |
696 | danger += 110; |
… | |
… | |
766 | const char *name2; |
764 | const char *name2; |
767 | |
765 | |
768 | if(ob->title == NULL) |
766 | if(ob->title == NULL) |
769 | name2 = ob->name; |
767 | name2 = ob->name; |
770 | else { |
768 | else { |
771 | snprintf(name_ob, sizeof(name_ob), "%s %s", ob->name, ob->title); |
769 | snprintf(name_ob, sizeof(name_ob), "%s %s", &ob->name, &ob->title); |
772 | name2 = name_ob; |
770 | name2 = name_ob; |
773 | } |
771 | } |
774 | |
772 | |
775 | if(strcmp(name2, name) == 0) { |
773 | if(strcmp(name2, name) == 0) { |
776 | if(ob->nrof%nrof == 0) { |
774 | if(ob->nrof%nrof == 0) { |