#include <stdio.h> #include "interact.h" #include "stringops.h" #include "socket.h" #include "group.h" #include "resp.h" #include "random_functs.h" static char output [1024]; typedef struct resp_validated { resp *r; struct resp_validated *next; } resp_validated; static resp_validated *resp_validated_add (resp_validated *rl, resp *r) { resp_validated *new; #ifdef FUNCTIONS puts ("**resp_validated_add"); #endif new = allocate (resp_validated); new->r = r; new->next = rl; return new; } static void resp_validated_burn (resp_validated *l) { #ifdef FUNCTIONS puts ("**resp_validated_burn"); #endif if (l) { resp_validated_burn (l->next); free (l); } } static resp_validated *resp_validated_valid (resp_list *list, int status, int *priority_total) { resp_validated *rl = NULL; resp *scan; #ifdef FUNCTIONS puts ("**resp_validated_valid"); #endif (*priority_total) = 0; for (scan = list->head; scan != NULL; scan = scan->next) { if ((!scan->lowerflag || (scan->lower <= status)) && (!scan->upperflag || (scan->upper >= status))) { rl = resp_validated_add (rl, scan); (*priority_total) += scan->priority; } } return rl; } void interact (globals *g, player *p, char *l) { group *gr_scan; stim_list *sl_scan; resp_validated *rl_list, *rl_scan; int result_flag, priority_total; #ifdef FUNCTIONS puts ("**interact"); #endif for (gr_scan = g->group_list->head; gr_scan != NULL; gr_scan = gr_scan->next) { if (stim_evaluate (gr_scan->s, g->name, l)) { rl_list = resp_validated_valid (gr_scan->r, p->status, &priority_total); if (rl_list && priority_total) { priority_total = random_int() % priority_total; rl_scan = rl_list; do { priority_total -= (rl_scan->r->priority); if (priority_total >= 0) rl_scan = rl_scan->next; } while (priority_total >= 0); (p->status) += rl_scan->r->status_change; resp_parse_output (rl_scan->r->response, p->name, g); } if (rl_list) resp_validated_burn (rl_list); } } }