--- deliantra/server/common/utils.C 2006/08/13 17:16:01 1.1 +++ deliantra/server/common/utils.C 2006/09/08 16:51:43 1.6 @@ -1,6 +1,6 @@ /* * static char *rcsid_utils_c = - * "$Id: utils.C,v 1.1 2006/08/13 17:16:01 elmex Exp $"; + * "$Id: utils.C,v 1.6 2006/09/08 16:51:43 root Exp $"; */ /* @@ -34,6 +34,8 @@ #include #include +#include + /* * The random functions here take luck into account when rolling random * dice or numbers. This function has less of an impact the larger the @@ -65,18 +67,18 @@ ran = RANDOM(); if (op->type != PLAYER) - return((ran%diff)+min); + return((ran%diff)+min); luck = op->stats.luck; if (RANDOM()%base < MIN(10, abs(luck))) { - /* we have a winner */ - ((luck > 0) ? (luck = 1) : (luck = -1)); - diff -= luck; - if (diff < 1) - return(omin); /*check again*/ - ((goodbad) ? (min += luck) : (diff)); + /* we have a winner */ + ((luck > 0) ? (luck = 1) : (luck = -1)); + diff -= luck; + if (diff < 1) + return(omin); /*check again*/ + ((goodbad) ? (min += luck) : (diff)); - return(MAX(omin, MIN(max, (ran%diff)+min))); + return(MAX(omin, MIN(max, (ran%diff)+min))); } return((ran%diff)+min); } @@ -111,18 +113,18 @@ ran = (RANDOM() & 0xffffffff) | ((sint64)RANDOM() << 32); if (op->type != PLAYER) - return((ran%diff)+min); + return((ran%diff)+min); luck = op->stats.luck; if (RANDOM()%base < MIN(10, abs(luck))) { - /* we have a winner */ - ((luck > 0) ? (luck = 1) : (luck = -1)); - diff -= luck; - if (diff < 1) - return(omin); /*check again*/ - ((goodbad) ? (min += luck) : (diff)); + /* we have a winner */ + ((luck > 0) ? (luck = 1) : (luck = -1)); + diff -= luck; + if (diff < 1) + return(omin); /*check again*/ + ((goodbad) ? (min += luck) : (diff)); - return(MAX(omin, MIN(max, (ran%diff)+min))); + return(MAX(omin, MIN(max, (ran%diff)+min))); } return((ran%diff)+min); } @@ -148,22 +150,22 @@ } if (op->type == PLAYER) - luck = op->stats.luck; + luck = op->stats.luck; for (i = 0; i < num; i++) { - if (RANDOM()%base < MIN(10, abs(luck)) && !gotlucky) { - /* we have a winner */ - gotlucky++; - ((luck > 0) ? (luck = 1) : (luck = -1)); - diff -= luck; - if (diff < 1) - return(num); /*check again*/ - ((goodbad) ? (min += luck) : (diff)); - ran = RANDOM(); - total += MAX(1, MIN(size, (ran%diff)+min)); - } else { - total += RANDOM()%size+1; - } + if (RANDOM()%base < MIN(10, abs(luck)) && !gotlucky) { + /* we have a winner */ + gotlucky++; + ((luck > 0) ? (luck = 1) : (luck = -1)); + diff -= luck; + if (diff < 1) + return(num); /*check again*/ + ((goodbad) ? (min += luck) : (diff)); + ran = RANDOM(); + total += MAX(1, MIN(size, (ran%diff)+min)); + } else { + total += RANDOM()%size+1; + } } return(total); } @@ -194,59 +196,59 @@ object *op, *otmp; if (m->unique) - return; + return; for (x=0; x < MAP_WIDTH(m); x++) - for (y=0; y < MAP_HEIGHT(m); y++) - for (op = get_map_ob(m, x, y); op; op = otmp) { - destroy = 0; - otmp = op->above; - if (QUERY_FLAG(op,FLAG_IS_FLOOR) && QUERY_FLAG(op, FLAG_UNIQUE)) - break; - if (QUERY_FLAG(op, FLAG_IS_FLOOR) || - QUERY_FLAG(op, FLAG_OBJ_ORIGINAL) || - QUERY_FLAG(op, FLAG_OBJ_SAVE_ON_OVL) || - QUERY_FLAG(op, FLAG_UNIQUE) || - QUERY_FLAG(op, FLAG_OVERLAY_FLOOR) || - QUERY_FLAG(op, FLAG_UNPAID) || IS_LIVE(op)) - continue; - /* otherwise, we decay and destroy */ - if (IS_WEAPON(op)) { - op->stats.dam--; - if (op->stats.dam < 0) - destroy = 1; - } else if (IS_ARMOR(op)) { - op->stats.ac--; - if (op->stats.ac < 0) - destroy = 1; - } else if (op->type == FOOD) { - op->stats.food -= rndm(5,20); - if (op->stats.food < 0) - destroy = 1; - } else { - if (op->material & M_PAPER || op->material & M_LEATHER || - op->material & M_WOOD || op->material & M_ORGANIC || - op->material & M_CLOTH || op->material & M_LIQUID) - destroy = 1; - if (op->material & M_IRON && rndm(1,5) == 1) - destroy = 1; - if (op->material & M_GLASS && rndm(1,2) == 1) - destroy = 1; - if ((op->material & M_STONE || op->material & M_ADAMANT) && - rndm(1,10) == 1) - destroy = 1; - if ((op->material & M_SOFT_METAL || op->material & M_BONE) && - rndm(1,3) == 1) - destroy = 1; - if (op->material & M_ICE && MAP_TEMP(m) > 32) - destroy = 1; - } - /* adjust overall chance below */ - if (destroy && rndm(0, 1)) { - remove_ob(op); - free_object(op); - } - } + for (y=0; y < MAP_HEIGHT(m); y++) + for (op = get_map_ob(m, x, y); op; op = otmp) { + destroy = 0; + otmp = op->above; + if (QUERY_FLAG(op,FLAG_IS_FLOOR) && QUERY_FLAG(op, FLAG_UNIQUE)) + break; + if (QUERY_FLAG(op, FLAG_IS_FLOOR) || + QUERY_FLAG(op, FLAG_OBJ_ORIGINAL) || + QUERY_FLAG(op, FLAG_OBJ_SAVE_ON_OVL) || + QUERY_FLAG(op, FLAG_UNIQUE) || + QUERY_FLAG(op, FLAG_OVERLAY_FLOOR) || + QUERY_FLAG(op, FLAG_UNPAID) || IS_LIVE(op)) + continue; + /* otherwise, we decay and destroy */ + if (IS_WEAPON(op)) { + op->stats.dam--; + if (op->stats.dam < 0) + destroy = 1; + } else if (IS_ARMOR(op)) { + op->stats.ac--; + if (op->stats.ac < 0) + destroy = 1; + } else if (op->type == FOOD) { + op->stats.food -= rndm(5,20); + if (op->stats.food < 0) + destroy = 1; + } else { + if (op->material & M_PAPER || op->material & M_LEATHER || + op->material & M_WOOD || op->material & M_ORGANIC || + op->material & M_CLOTH || op->material & M_LIQUID) + destroy = 1; + if (op->material & M_IRON && rndm(1,5) == 1) + destroy = 1; + if (op->material & M_GLASS && rndm(1,2) == 1) + destroy = 1; + if ((op->material & M_STONE || op->material & M_ADAMANT) && + rndm(1,10) == 1) + destroy = 1; + if ((op->material & M_SOFT_METAL || op->material & M_BONE) && + rndm(1,3) == 1) + destroy = 1; + if (op->material & M_ICE && MAP_TEMP(m) > 32) + destroy = 1; + } + /* adjust overall chance below */ + if (destroy && rndm(0, 1)) { + remove_ob(op); + free_object(op); + } + } } /* convert materialname to materialtype_t */ @@ -257,10 +259,10 @@ mt = NULL; for (nmt = materialt; nmt != NULL && nmt->next != NULL; nmt=nmt->next) { - if (strcmp(name, nmt->name) == 0) { - mt = nmt; - break; - } + if (strcmp(name, nmt->name) == 0) { + mt = nmt; + break; + } } return mt; } @@ -275,100 +277,102 @@ int j; if (op->materialname == NULL) - return; + return; if (change->materialname != NULL && - strcmp(op->materialname, change->materialname)) - return; + strcmp(op->materialname, change->materialname)) + return; if (!IS_ARMOR(op)) - return; + return; mt = name_to_material(op->materialname); if (!mt) { - LOG(llevError, "archetype '%s>%s' uses nonexistent material '%s'\n", op->arch->name, op->name, op->materialname); + LOG(llevError, "archetype '%s>%s' uses nonexistent material '%s'\n", &op->arch->name, &op->name, &op->materialname); return; } for (j=0; j < NROFATTACKS; j++) - if (op->resist[j] == 0 && change->resist[j] != 0) { - op->resist[j] += mt->mod[j]; - if (op->resist[j] > 100) - op->resist[j] = 100; - if (op->resist[j] < -100) - op->resist[j] = -100; - } + if (op->resist[j] == 0 && change->resist[j] != 0) { + op->resist[j] += mt->mod[j]; + if (op->resist[j] > 100) + op->resist[j] = 100; + if (op->resist[j] < -100) + op->resist[j] = -100; + } } /* set the materialname and type for an item */ void set_materialname(object *op, int difficulty, materialtype_t *nmt) { materialtype_t *mt, *lmt; +#ifdef NEW_MATERIAL_CODE int j; +#endif if (op->materialname != NULL) - return; + return; if (nmt == NULL) { - lmt = NULL; + lmt = NULL; #ifndef NEW_MATERIAL_CODE - for (mt = materialt; mt != NULL && mt->next != NULL; mt=mt->next) { - if (op->material & mt->material) { - lmt = mt; - break; - } - } + for (mt = materialt; mt != NULL && mt->next != NULL; mt=mt->next) { + if (op->material & mt->material) { + lmt = mt; + break; + } + } #else - for (mt = materialt; mt != NULL && mt->next != NULL; mt=mt->next) { - if (op->material & mt->material && rndm(1, 100) <= mt->chance && - difficulty >= mt->difficulty && - (op->magic >= mt->magic || mt->magic == 0)) { - lmt = mt; - if (!(IS_WEAPON(op) || IS_ARMOR(op))) - break; - } - } + for (mt = materialt; mt != NULL && mt->next != NULL; mt=mt->next) { + if (op->material & mt->material && rndm(1, 100) <= mt->chance && + difficulty >= mt->difficulty && + (op->magic >= mt->magic || mt->magic == 0)) { + lmt = mt; + if (!(IS_WEAPON(op) || IS_ARMOR(op))) + break; + } + } #endif } else { - lmt = nmt; + lmt = nmt; } if (lmt != NULL) { #ifndef NEW_MATERIAL_CODE - op->materialname = add_string(lmt->name); - return; + op->materialname = lmt->name; + return; #else - if (op->stats.dam && IS_WEAPON(op)) { - op->stats.dam += lmt->damage; - if (op->stats.dam < 1) - op->stats.dam = 1; - } - if (op->stats.sp && op->type == BOW) - op->stats.sp += lmt->sp; - if (op->stats.wc && IS_WEAPON(op)) - op->stats.wc += lmt->wc; - if (IS_ARMOR(op)) { - if (op->stats.ac) - op->stats.ac += lmt->ac; - for (j=0; j < NROFATTACKS; j++) - if (op->resist[j] != 0) { - op->resist[j] += lmt->mod[j]; - if (op->resist[j] > 100) - op->resist[j] = 100; - if (op->resist[j] < -100) - op->resist[j] = -100; - } - } - op->materialname = add_string(lmt->name); - /* dont make it unstackable if it doesn't need to be */ - if (IS_WEAPON(op) || IS_ARMOR(op)) { - op->weight = (op->weight * lmt->weight)/100; - op->value = (op->value * lmt->value)/100; - } + if (op->stats.dam && IS_WEAPON(op)) { + op->stats.dam += lmt->damage; + if (op->stats.dam < 1) + op->stats.dam = 1; + } + if (op->stats.sp && op->type == BOW) + op->stats.sp += lmt->sp; + if (op->stats.wc && IS_WEAPON(op)) + op->stats.wc += lmt->wc; + if (IS_ARMOR(op)) { + if (op->stats.ac) + op->stats.ac += lmt->ac; + for (j=0; j < NROFATTACKS; j++) + if (op->resist[j] != 0) { + op->resist[j] += lmt->mod[j]; + if (op->resist[j] > 100) + op->resist[j] = 100; + if (op->resist[j] < -100) + op->resist[j] = -100; + } + } + op->materialname = add_string(lmt->name); + /* dont make it unstackable if it doesn't need to be */ + if (IS_WEAPON(op) || IS_ARMOR(op)) { + op->weight = (op->weight * lmt->weight)/100; + op->value = (op->value * lmt->value)/100; + } #endif } } @@ -422,33 +426,33 @@ */ void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize) { - size_t resultlen; - size_t keylen; + size_t resultlen; + size_t keylen; + + /* special case to prevent infinite loop if key==replacement=="" */ + if(strcmp(key, replacement) == 0) + { + snprintf(result, resultsize, "%s", src); + return; + } + + keylen = strlen(key); - /* special case to prevent infinite loop if key==replacement=="" */ - if(strcmp(key, replacement) == 0) - { - snprintf(result, resultsize, "%s", src); - return; - } - - keylen = strlen(key); - - resultlen = 0; - while(*src != '\0' && resultlen+1 < resultsize) - { - if(strncmp(src, key, keylen) == 0) - { - snprintf(result+resultlen, resultsize-resultlen, "%s", replacement); - resultlen += strlen(result+resultlen); - src += keylen; - } - else - { - result[resultlen++] = *src++; - } - } - result[resultlen] = '\0'; + resultlen = 0; + while(*src != '\0' && resultlen+1 < resultsize) + { + if(strncmp(src, key, keylen) == 0) + { + snprintf(result+resultlen, resultsize-resultlen, "%s", replacement); + resultlen += strlen(result+resultlen); + src += keylen; + } + else + { + result[resultlen++] = *src++; + } + } + result[resultlen] = '\0'; } /** @@ -468,17 +472,45 @@ strncpy(tmp, input, MAX_BUF-5); /*trim all trailing commas, spaces etc.*/ for (i=strlen(tmp); !isalnum(tmp[i]) && i >= 0; i--) - tmp[i]='\0'; + tmp[i]='\0'; strcat(tmp, "."); p=strrchr(tmp, ','); if (p) { - *p='\0'; - strcpy(input, tmp); - p++; - strcat(input, " and"); - strcat(input, p); + *p='\0'; + strcpy(input, tmp); + p++; + strcat(input, " and"); + strcat(input, p); } else strcpy(input, tmp); return; } + +//TODO: overhead due to specifying size twice +void * +zero_initialised::operator new (size_t s) +{ +printf ("new(%d)\n", s);//D + return g_slice_alloc0 (s); +} + +void * +zero_initialised::operator new [] (size_t s) +{ +printf ("new[](%d)\n", s);//D + return g_slice_alloc0 (s); +} + +void +zero_initialised::operator delete (void *p, size_t s) +{ + g_slice_free1 (s, p); +} + +void +zero_initialised::operator delete [] (void *p, size_t s) +{ + g_slice_free1 (s, p); +} +