Ticket #641: md_641.patch

File md_641.patch, 6.8 KB (added by MarbleDice, 9 years ago)

Fix quest artifacts, hopefully doesn't break any of the other fragile object generation systems.

  • src/monster/monster2.c

     
    29152915                /* Get local object */ 
    29162916                i_ptr = &object_type_body; 
    29172917 
    2918                 /* Mega-Hack -- Prepare to make "Grond" */ 
     2918                /* Mega-Hack -- Make "Grond" */ 
    29192919                object_prep(i_ptr, lookup_kind(TV_HAFTED, SV_GROND), 0, MAXIMISE); 
     2920                i_ptr->name1 = ART_GROND; 
     2921                apply_magic(i_ptr, 0, TRUE, TRUE, TRUE); 
    29202922 
    2921                 /* Note -- We must not set name1 so that it can be made into 
    2922                  * an artifact by apply_magic */ 
    2923  
    2924                 /* Mega-Hack -- Actually create "Grond" */ 
    2925                 apply_magic(i_ptr, -1, TRUE, TRUE, TRUE); 
    2926  
    29272923                i_ptr->origin = ORIGIN_DROP; 
    29282924                i_ptr->origin_depth = p_ptr->depth; 
    29292925                i_ptr->origin_xtra = m_ptr->r_idx; 
     
    29352931                /* Get local object */ 
    29362932                i_ptr = &object_type_body; 
    29372933 
    2938                 /* Mega-Hack -- Prepare to make "Morgoth" */ 
     2934                /* Mega-Hack -- Make "Morgoth" */ 
    29392935                object_prep(i_ptr, lookup_kind(TV_CROWN, SV_MORGOTH), 0, MAXIMISE); 
     2936                i_ptr->name1 = ART_MORGOTH; 
     2937                apply_magic(i_ptr, 0, TRUE, TRUE, TRUE); 
    29402938 
    2941                 /* Mega-Hack -- Actually create "Morgoth" */ 
    2942                 apply_magic(i_ptr, -1, TRUE, TRUE, TRUE); 
    2943  
    29442939                i_ptr->origin = ORIGIN_DROP; 
    29452940                i_ptr->origin_depth = p_ptr->depth; 
    29462941                i_ptr->origin_xtra = m_ptr->r_idx; 
  • src/object/obj-make.c

     
    394394 
    395395 
    396396/* 
    397  * Attempt to change an object into an artifact 
     397 * Attempt to change an object into an artifact.  If the object's name1 
     398 * is already set, use that artifact.  Otherwise, look for a suitable 
     399 * artifact and attempt to use it. 
    398400 * 
    399401 * This routine should only be called by "apply_magic()" 
    400402 * 
     
    402404 */ 
    403405static bool make_artifact(object_type *o_ptr) 
    404406{ 
     407        artifact_type *a_ptr; 
    405408        int i; 
    406409 
    407410 
    408411        /* No artifacts, do nothing */ 
    409         if (OPT(adult_no_artifacts)) return (FALSE); 
     412        if (OPT(adult_no_artifacts) && 
     413            o_ptr->name1 != ART_GROND && 
     414            o_ptr->name1 != ART_MORGOTH) 
     415                return (FALSE); 
    410416 
    411417        /* No artifacts in the town */ 
    412418        if (!p_ptr->depth) return (FALSE); 
     
    415421        if (o_ptr->number != 1) return (FALSE); 
    416422 
    417423        /* Check the artifact list (skip the "specials") */ 
    418         for (i = ART_MIN_NORMAL; i < z_info->a_max; i++) 
     424        for (i = ART_MIN_NORMAL; !o_ptr->name1 && i < z_info->a_max; i++) 
    419425        { 
    420                 artifact_type *a_ptr = &a_info[i]; 
     426                a_ptr = &a_info[i]; 
    421427 
    422428                /* Skip "empty" items */ 
    423429                if (!a_ptr->name) continue; 
     
    447453 
    448454                /* Mark the item as an artifact */ 
    449455                o_ptr->name1 = i; 
     456        } 
    450457 
     458        if (o_ptr->name1) 
     459        { 
     460                a_ptr = &a_info[o_ptr->name1]; 
     461 
    451462                /* Copy across all the data from the artifact struct */ 
    452463                copy_artifact_data(o_ptr, a_ptr); 
    453464 
    454                 /* Hack -- Mark the artifact as "created" */ 
     465                /* Mark the artifact as "created" */ 
    455466                a_ptr->created = 1; 
    456467 
    457468                return TRUE; 
     
    884895} 
    885896 
    886897 
     898/* 
     899 * Prepare an object based on an object kind. 
     900 * Use the specified randomization aspect 
     901 */ 
     902void object_prep(object_type *o_ptr, int k_idx, int lev, aspect rand_aspect) 
     903{ 
     904        object_kind *k_ptr = &k_info[k_idx]; 
     905 
     906        /* Clear the record */ 
     907        (void)WIPE(o_ptr, object_type); 
     908 
     909        /* Save the kind index */ 
     910        o_ptr->k_idx = k_idx; 
     911 
     912        /* Efficiency -- tval/sval */ 
     913        o_ptr->tval = k_ptr->tval; 
     914        o_ptr->sval = k_ptr->sval; 
     915 
     916        /* Default number */ 
     917        o_ptr->number = 1; 
     918 
     919        /* Default "pval" */ 
     920        o_ptr->pval = randcalc(k_ptr->pval, lev, rand_aspect); 
     921 
     922        /* Default weight */ 
     923        o_ptr->weight = k_ptr->weight; 
     924         
     925        /* Assign charges (wands/staves only) */ 
     926        if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) 
     927                o_ptr->pval = randcalc(k_ptr->charge, lev, rand_aspect); 
     928 
     929        /* Default magic */ 
     930        o_ptr->to_h = randcalc(k_ptr->to_h, lev, rand_aspect); 
     931        o_ptr->to_d = randcalc(k_ptr->to_d, lev, rand_aspect); 
     932        o_ptr->to_a = randcalc(k_ptr->to_a, lev, rand_aspect); 
     933 
     934        /* Default power */ 
     935        o_ptr->ac = k_ptr->ac; 
     936        o_ptr->dd = k_ptr->dd; 
     937        o_ptr->ds = k_ptr->ds; 
     938 
     939        /* Hack -- cursed items are always "cursed" */ 
     940        if (k_ptr->flags[2] & TR2_LIGHT_CURSE) 
     941            o_ptr->flags[2] |= TR2_LIGHT_CURSE; 
     942} 
     943 
     944 
    887945/** 
    888946 * Complete object creation by applying magic to it. 
    889947 * 
     
    934992 
    935993 
    936994        /* Roll for artifact creation */ 
    937         if (allow_artifacts && !o_ptr->name1) 
     995        if (allow_artifacts) 
    938996        { 
    939997                int i; 
    940998                int rolls = 0; 
  • src/object/obj-util.c

     
    18581858} 
    18591859 
    18601860 
    1861 /* 
    1862  * Prepare an object based on an object kind. 
    1863  * Use the specified randomization aspect 
    1864  */ 
    1865 void object_prep(object_type *o_ptr, int k_idx, int lev, aspect rand_aspect) 
    1866 { 
    1867         object_kind *k_ptr = &k_info[k_idx]; 
    1868  
    1869         /* Clear the record */ 
    1870         (void)WIPE(o_ptr, object_type); 
    1871  
    1872         /* Save the kind index */ 
    1873         o_ptr->k_idx = k_idx; 
    1874  
    1875         /* Efficiency -- tval/sval */ 
    1876         o_ptr->tval = k_ptr->tval; 
    1877         o_ptr->sval = k_ptr->sval; 
    1878  
    1879         /* Default "pval" */ 
    1880         o_ptr->pval = randcalc(k_ptr->pval, lev, rand_aspect); 
    1881  
    1882         /* Default number */ 
    1883         o_ptr->number = 1; 
    1884  
    1885         /* Default weight */ 
    1886         o_ptr->weight = k_ptr->weight; 
    1887          
    1888         /* Assign charges (wands/staves only) */ 
    1889         if (o_ptr->tval == TV_WAND || o_ptr->tval == TV_STAFF) 
    1890                 o_ptr->pval = randcalc(k_ptr->charge, lev, rand_aspect); 
    1891  
    1892         /* Default magic */ 
    1893         o_ptr->to_h = randcalc(k_ptr->to_h, lev, rand_aspect); 
    1894         o_ptr->to_d = randcalc(k_ptr->to_d, lev, rand_aspect); 
    1895         o_ptr->to_a = randcalc(k_ptr->to_a, lev, rand_aspect); 
    1896  
    1897         /* Default power */ 
    1898         o_ptr->ac = k_ptr->ac; 
    1899         o_ptr->dd = k_ptr->dd; 
    1900         o_ptr->ds = k_ptr->ds; 
    1901  
    1902         /* Hack -- cursed items are always "cursed" */ 
    1903         if (k_ptr->flags[2] & TR2_LIGHT_CURSE) 
    1904             o_ptr->flags[2] |= TR2_LIGHT_CURSE; 
    1905 } 
    1906  
    1907  
    19081861/** 
    19091862 * Find and return the index to the oldest object on the given grid marked as 
    19101863 * "squelch". 
  • src/object/object.h

     
    140140void free_obj_alloc(void); 
    141141bool init_obj_alloc(void); 
    142142s16b get_obj_num(int level, bool good); 
     143void object_prep(object_type *o_ptr, int k_idx, int lev, aspect rand_aspect); 
    143144void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great); 
    144145bool make_object(object_type *j_ptr, int lev, bool good, bool great); 
    145146void make_gold(object_type *j_ptr, int lev, int coin_type); 
     
    189190void object_wipe(object_type *o_ptr); 
    190191void object_copy(object_type *o_ptr, const object_type *j_ptr); 
    191192void object_copy_amt(object_type *dst, object_type *src, int amt); 
    192 void object_prep(object_type *o_ptr, int k_idx, int lev, aspect rand_aspect); 
    193193s16b floor_carry(int y, int x, object_type *j_ptr); 
    194194void drop_near(object_type *j_ptr, int chance, int y, int x, bool verbose); 
    195195void acquirement(int y1, int x1, int level, int num, bool great);