DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦05b323957⟧ TextFile

    Length: 4114 (0x1012)
    Types: TextFile
    Names: »mkobj.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Nethack/mkobj.c« 

TextFile

/*	SCCS Id: @(#)mkobj.c	2.2	87/11/29
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */

#include "hack.h"
#ifdef SPELLS
char mkobjstr[] = "))[[!!!!????+%%%%/=**))[[!!!!????+%%%%/=**(%";
#else
char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
#endif

struct obj *mkobj(), *mksobj();

struct obj *
mkobj_at(let,x,y)
register int let,x,y;
{
	register struct obj *otmp = mkobj(let);
	otmp->ox = x;
	otmp->oy = y;
	otmp->nobj = fobj;
	fobj = otmp;
	return(otmp);
}

struct obj *
mksobj_at(otyp,x,y)
register int otyp,x,y;
{
	register struct obj *otmp = mksobj(otyp);
	otmp->ox = x;
	otmp->oy = y;
	otmp->nobj = fobj;
	return((fobj = otmp));
}

#ifdef RPH
struct obj *
mk_named_obj_at (let, x, y, nm, lth)	/* used for named corpses */
register let, x, y;
char * nm;
register int lth;
{
	register struct obj *otmp;
	register struct obj *obj2;

	if (lth == 0)  return (mkobj_at (let,x,y));

	otmp =  mkobj(let);
	obj2 = newobj(lth);
	*obj2 = *otmp;
	obj2->onamelth = lth;
	(void) strcpy (ONAME(obj2), nm);
	free( (char *)otmp);
	obj2->ox = x;
	obj2->oy = y;
	obj2->nobj = fobj;
	fobj = obj2;
	return(obj2);
}
#endif

struct obj *
mkobj(let) {
int realtype;
	switch (let) {
		case RANDOM_SYM: {
			realtype=probtype(mkobjstr[rn2(sizeof(mkobjstr)-1)]);
			break;
		}
		case '3': { realtype = DEAD_SOLDIER; break; }
		case '9': { realtype = DEAD_GIANT; break; }
		case '&': { realtype = DEAD_DEMON; break; }
		default: realtype = letter(let) ?
				CORPSE + ((let>'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@'))
			:	probtype(let);
	}
	return(mksobj(realtype));
}
	

struct obj zeroobj;

struct obj *
mksobj(otyp)
register otyp;
{
	register struct obj *otmp;
	char let = objects[otyp].oc_olet;

	otmp = newobj(0);
	*otmp = zeroobj;
	otmp->age = moves;
	otmp->o_id = flags.ident++;
	otmp->quan = 1;
	otmp->olet = let;
	otmp->otyp = otyp;
	otmp->dknown = index(
#ifdef KAA
#ifdef SPELLS
	"/=!?*+)",
#else
	"/=!?*)",
#endif
#else
#ifdef SPELLS
	"/=!?*+",
#else
	"/=!?*",
#endif
#endif
		    let) ? 0 : 1;
	switch(let) {
	case WEAPON_SYM:
		otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1;
		if(!rn2(11)) otmp->spe = rne(2);
		else if(!rn2(10)) {
			otmp->cursed = 1;
			otmp->spe = -rne(2);
		}
		break;
	case FOOD_SYM:
		if(otmp->otyp >= CORPSE) break;
#ifdef NOT_YET_IMPLEMENTED
		/* if tins are to be identified, need to adapt doname() etc */
		if(otmp->otyp == TIN)
			otmp->spe = rnd(...);
#endif
		/* fall into next case */
	case GEM_SYM:
		otmp->quan = rn2(6) ? 1 : 2;
	case TOOL_SYM:
	case CHAIN_SYM:
	case BALL_SYM:
	case ROCK_SYM:
	case POTION_SYM:
	case SCROLL_SYM:
	case AMULET_SYM:
		break;
#ifdef SPELLS
	case SPBOOK_SYM:
		if(!rn2(17)) otmp->cursed = 1;
		break;
#endif
	case ARMOR_SYM:
		if(!rn2(8)) otmp->cursed = 1;
		if(!rn2(10)) otmp->spe = rne(2);
		else if(!rn2(9)) {
			otmp->spe = -rne(2);
			otmp->cursed = 1;
		}
		break;
	case WAND_SYM:
#ifdef HARD
		if(otmp->otyp == WAN_WISHING) otmp->spe = rnd(3); else
#else		
		if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else
#endif		
		otmp->spe = rn1(5,
			(objects[otmp->otyp].bits & NODIR) ? 11 : 4);
		break;
	case RING_SYM:
		if(objects[otmp->otyp].bits & SPEC) {
			if(!rn2(3)) {
				otmp->cursed = 1;
				otmp->spe = -rne(3);
			} else otmp->spe = rne(3);
		} else if(otmp->otyp == RIN_TELEPORTATION ||
			  otmp->otyp == RIN_POLYMORPH ||
			  otmp->otyp == RIN_AGGRAVATE_MONSTER ||
			  otmp->otyp == RIN_HUNGER || !rn2(9))
			otmp->cursed = 1;
		break;
	default:
		panic("impossible mkobj %d, sym '%c'.", otmp->otyp, let);
	}
	otmp->owt = weight(otmp);
	return(otmp);
}

letter(c) {
	return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
}

weight(obj)
register struct obj *obj;
{
register int wt = objects[obj->otyp].oc_weight;
	return(wt ? wt*obj->quan : (obj->quan + 1)/2);
}

mkgold(num,x,y)
register long num;
{
	register struct gold *gold;
	register long amount = (num ? num : 1 + (rnd(dlevel+2) * rnd(30)));

	if(gold = g_at(x,y))
		gold->amount += amount;
	else {
		gold = newgold();
		gold->ngold = fgold;
		gold->gx = x;
		gold->gy = y;
		gold->amount = amount;
		fgold = gold;
		/* do sth with display? */
	}
}