42 int random_roll(
int min,
int max,
const object *op,
int goodbad) {
43 int omin, diff, luck, base, ran;
47 ((diff > 2) ? (base = 20) : (base = 50));
49 if (max < 1 || diff < 1) {
50 LOG(
llevError,
"Calling random_roll with min=%d max=%d\n", min, max);
57 return((ran%diff)+min);
60 if (
RANDOM()%base < (
unsigned int)
MIN(10, abs(luck))) {
62 ((luck > 0) ? (luck = 1) : (luck = -1));
66 ((goodbad) ? (min += luck) : (diff));
68 return(
MAX(omin,
MIN(max, (ran%diff)+min)));
70 return((ran%diff)+min);
84 ((diff > 2) ? (base = 20) : (base = 50));
86 if (max < 1 || diff < 1) {
99 return((ran%diff)+min);
102 if (
RANDOM()%base < (
unsigned int)
MIN(10, abs(luck))) {
104 ((luck > 0) ? (luck = 1) : (luck = -1));
108 ((goodbad) ? (min += luck) : (diff));
110 return (
MAX(omin,
MIN(max, (ran%diff)+min)));
112 return ((ran%diff)+min);
122 int die_roll(
int num,
int size,
const object *op,
int goodbad) {
123 int min, diff, luck, total, i, gotlucky, base, ran;
127 luck = total = gotlucky = 0;
128 ((diff > 2) ? (base = 20) : (base = 50));
129 if (size < 2 || diff < 1) {
130 LOG(
llevError,
"Calling die_roll with num=%d size=%d\n", num, size);
137 for (i = 0; i < num; i++) {
138 if (
RANDOM()%base < (
unsigned int)
MIN(10, abs(luck)) && !gotlucky) {
141 ((luck > 0) ? (luck = 1) : (luck = -1));
145 ((goodbad) ? (min += luck) : (diff));
147 total +=
MAX(1,
MIN(size, (ran%diff)+min));
166 if (max < 1 || diff < 1)
169 return (
RANDOM()%diff+min);
200 if (op->stats.dam < 0)
206 || op->type ==
CLOAK) {
208 if (op->stats.ac < 0)
210 }
else if (op->type ==
FOOD) {
211 op->stats.food -=
rndm(5, 20);
212 if (op->stats.food < 0)
231 if (op->material&
M_ICE &&
rndm(0, 100) > 70)
235 if (destroy &&
rndm(0, 1)) {
253 if (strcmp(name, nmt->
name) == 0) {
325 const char *
strrstr(
const char *haystack,
const char *needle) {
326 const char *lastneedle;
329 while ((haystack = strstr(haystack, needle)) != NULL) {
330 lastneedle = haystack;
336 #define EOL_SIZE (sizeof("\n")-1) 342 if (strlen(buf) <
sizeof(
"\n")) {
345 if (!strcmp(buf+strlen(buf)-
EOL_SIZE,
"\n"))
354 void replace(
const char *src,
const char *key,
const char *replacement,
char *result,
size_t resultsize) {
359 if (strcmp(key, replacement) == 0) {
360 snprintf(result, resultsize,
"%s", src);
364 keylen = strlen(key);
367 while (*src !=
'\0' && resultlen+1 < resultsize) {
368 if (strncmp(src, key, keylen) == 0) {
369 snprintf(result+resultlen, resultsize-resultlen,
"%s", replacement);
370 resultlen += strlen(result+resultlen);
373 result[resultlen++] = *src++;
376 result[resultlen] =
'\0';
398 if (!input || strlen(input) >
MAX_BUF-5)
402 strncpy(tmp, input,
MAX_BUF-5);
404 for (i = strlen(tmp); i >= 0 && !isalnum(tmp[i]); i--) {
409 p = strrchr(tmp,
',');
414 strcat(input,
" and");
456 diff = (destination_dir-dir)&7;
457 if (1 <= diff && diff <= 3)
459 else if (5 <= diff && diff <= 7)
461 else if (
rndm(0, 1) == 0)
477 for (p = buf; *p !=
'\0'; p++) {
500 size_t split_string(
char *str,
char *array[],
size_t array_size,
char sep) {
514 while (pos < array_size) {
516 while (*p !=
'\0' && *p != sep)
518 if (pos >= array_size)
598 const char *fatalmsgs[] = {
599 "Failed to allocate memory",
600 "Failed repeatedly to load maps",
601 "Hashtable for archetypes is too small",
602 "Fatal issue in archetype file",
606 fprintf(
logfile,
"Fatal error: %s\n", fatalmsgs[err]);
609 fprintf(
logfile,
"Exiting...\n");
int64_t random_roll64(int64_t min, int64_t max, const object *op, int goodbad)
void clean_tmp_files(void)
const char * strrstr(const char *haystack, const char *needle)
materialtype_t * name_to_material(const char *name)
EXTERN materialtype_t * materialt
void fatal(enum fatal_error err)
StringBuffer * stringbuffer_new(void)
void decay_objects(mapstruct *m)
void strip_endline(char *buf)
void transmute_materialname(object *op, const object *change)
const char *const spellpathnames[NRSPELLPATHS]
int adjust_dir(int dir, int destination_dir)
int rndm(int min, int max)
void make_list_like(char *input)
const char * destination_dir
void object_free_drop_inventory(object *ob)
int get_randomized_dir(int dir)
#define FLAG_OBJ_ORIGINAL
void stringbuffer_append_string(StringBuffer *sb, const char *str)
const char * materialname
int die_roll(int num, int size, const object *op, int goodbad)
#define FLAG_OVERLAY_FLOOR
#define QUERY_FLAG(xyz, p)
void emergency_save(int flag)
StringBuffer * describe_attacktype(const char *attack, int value, StringBuffer *buf)
void replace_unprintable_chars(char *buf)
int16_t resist[NROFATTACKS]
void replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize)
sstring add_string(const char *str)
void stringbuffer_append_printf(StringBuffer *sb, const char *format,...)
StringBuffer * describe_spellpath_attenuation(const char *attenuation, int value, StringBuffer *buf)
size_t split_string(char *str, char *array[], size_t array_size, char sep)
void LOG(LogLevel logLevel, const char *format,...)
struct _materialtype * next
#define FOR_MAP_PREPARE(map_, mx_, my_, it_)
void set_materialname(object *op)
int random_roll(int min, int max, const object *op, int goodbad)
void object_remove(object *op)
const char *const attacks[NROFATTACKS]