/* * Logic Creature Script added by Charles Marchant for * Mordor 3.x * */ #include "mstruct.h" #include "mextern.h" #ifdef DMALLOC #include "/usr/local/include/dmalloc.h" #endif int load_crt_actions(crt_ptr) creature *crt_ptr; { ttag *act,*a; char crt_name[80]; char filename[256]; char cmdstr[80]; char responsestr[1024]; int i,count = 0; char *ptr; FILE *fp; if(!F_ISSET(crt_ptr,MROBOT)) return 0; if(crt_ptr->first_tlk) return 1; strcpy(crt_name,crt_ptr->name); for(i=0;crt_name[i];i++) if(crt_name[i] == ' ') crt_name[i] = '_'; sprintf(filename,"%s/talk/%s-%d-act",MONPATH,crt_name,crt_ptr->level); fp = fopen(filename,"r"); if(!fp) return 0; fgets(cmdstr,80,fp); while(!feof(fp)) { count++; act = (ttag *)calloc(1,sizeof(ttag)); act->key = 0; act->target = 0; act->action = 0; act->response = 0; act->next_tag = 0; if(!act) merror("load_crt_actions",FATAL); ptr = cmdstr; act->type = count; while(*ptr) { switch(*ptr) { case '?': /* tester */ ptr++; act->test_for = *ptr++; if(*ptr == ':') act->arg1 = atoi(++ptr); break; case '@': /* unconditional goto cmd */ ptr++; act->goto_cmd = atoi(ptr); break; case '!': /* if not last comand success goto cmd */ ptr++; act->if_cmd = atoi(ptr); for(;*ptr && *ptr != ':';ptr++); ptr++; act->not_goto_cmd = atoi(ptr); break; case '=': /* if last command succesful goto cmd */ ptr++; act->if_cmd = atoi(ptr); for(;*ptr && *ptr != ':';ptr++); ptr++; act->if_goto_cmd = atoi(ptr); break; case '>': ptr++; act->do_act = *ptr++; if(*ptr == ':') act->arg1 = atoi(++ptr); break; default: merror("ERROR - logic command", NONFATAL); logn("Errors", "UNKOWN LOGIC COMMAND [%s] in %s\n",cmdstr,filename); act->do_act = 0; act->goto_cmd = 1; for(;*ptr;ptr++); break; } for(;*ptr && *ptr != ' ';ptr++); for(;*ptr && *ptr == ' ';ptr++); }/* end of command string parsing */ fgets(responsestr,1024,fp); if(responsestr[0] != '*') { ptr = responsestr; while(*ptr) if(*ptr == '\n' || *ptr == '\r') *ptr = 0; else ptr++; act->response = (char *)calloc(1,strlen(responsestr)+1); if(!act->response) merror("load_crt_action",FATAL); strcpy(act->response,responsestr); } else act->response = 0; act->next_tag = 0; if(!crt_ptr->first_tlk) { crt_ptr->first_tlk = act; act->on_cmd = 1; } else { for(a = crt_ptr->first_tlk;a->next_tag;a = a->next_tag); a->next_tag = act; } fgets(cmdstr,80,fp); if(feof(fp)) break; } fclose(fp); }