⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npccgi.c

📁 Npc Generator
💻 C
📖 第 1 页 / 共 3 页
字号:
  tags[35] = wtTagReplace( "DOPCGEN", pcgen );  tags[36] = 0;  tem = getLookAndFeel( qValueDefault( "standard", "look" ) )->longdesc;  wtWriteTemplateToFile( stdout, tem, tags );  wtFreeTagList( tags );  return 0;}int displayNPC( wtSTREAM_t *stream, wtTAG_t** tags, wtGENERIC_t data, char* other ) {  NPC**   npc;  int     count;  npc = (NPC**)data;  count = qiValue( "count" );  if( count < 1 ) {    count = 1;  }  if( qiValue( "statblock" ) || ( count > 1 ) ) {    displayNPC_StatBlock( stream, npc );  } else {    displayNPC_Full( stream, npc[0] );  }  return 0;}int doStatBlockConfigure() {  wtTAG_t *tags[14];    wtDELEGATE_t deltags[11];  wtIF_t iftags[11];  int i;  char* tem;  for( i = 0; i < 11; i++ ) {    iftags[i].neg = 0;    iftags[i].text = "CHECKED";    deltags[i].handler = wtConditionalHandler;    deltags[i].userData = &(iftags[i]);  }  iftags[0].value  = qValueDefault( "0", "stats_ability_bonuses" );  iftags[1].value  = qValueDefault( "1", "stats_ac_breakdown" );  iftags[2].value  = qValueDefault( "1", "stats_init_breakdown" );  iftags[3].value  = qValueDefault( "0", "stats_attack_breakdown" );  iftags[4].value  = qValueDefault( "0", "stats_save_breakdown" );  iftags[5].value  = qValueDefault( "0", "stats_skill_breakdown" );  iftags[6].value  = qValueDefault( "1", "stats_languages" );  iftags[7].value  = qValueDefault( "1", "stats_skillsfeats" );  iftags[8].value  = qValueDefault( "1", "stats_possessions" );  iftags[9].value  = qValueDefault( "1", "stats_spells" );  iftags[10].value = qValueDefault( "1", "stats_formatting" );  tags[0]  = wtTagDelegate( "STATSABILITYBONUSES", &(deltags[0]) );  tags[1]  = wtTagDelegate( "STATSACBREAKDOWN", &(deltags[1]) );  tags[2]  = wtTagDelegate( "STATSINITBREAKDOWN", &(deltags[2]) );  tags[3]  = wtTagDelegate( "STATSATTACKBREAKDOWN", &(deltags[3]) );  tags[4]  = wtTagDelegate( "STATSSAVEBREAKDOWN", &(deltags[4]) );  tags[5]  = wtTagDelegate( "STATSSKILLBREAKDOWN", &(deltags[5]) );  tags[6]  = wtTagDelegate( "STATSLANGUAGES", &(deltags[6]) );  tags[7]  = wtTagDelegate( "STATSSKILLSFEATS", &(deltags[7]) );  tags[8]  = wtTagDelegate( "STATSPOSSESSIONS", &(deltags[8]) );  tags[9]  = wtTagDelegate( "STATSSPELLS", &(deltags[9]) );  tags[10] = wtTagDelegate( "STATSFORMATTING", &(deltags[10]) );  tags[11] = wtTagReplace( "CGINAME", CGINAME );  tags[12] = wtTagReplace( "LOOK", qValueDefault( "standard", "look" ) );  tags[13] = 0;  tem = getLookAndFeel( qValueDefault( "standard", "look" ) )->config;  wtWriteTemplateToFile( stdout, tem, tags );  wtFreeTagList( tags );  return 0;}int main( int argc, char* argv[] ) {  NPC** npc;  time_t seed;  wtTAG_t *tags[30];  wtDELEGATE_t npcDesc;  char buffer[100];  char* tem;  int i;  int count;  int istrat;  wtSTREAM_t* stream;         char *alignment;  char *gender;  char *race;  char *cls[3];  char *level[3];  char *stat;  char *scnt;  char *strat;  char *background;  char *look;  char *action;  char *defon;  char* defoff;  wtIF_t if_al;  wtIF_t if_gen;  wtIF_t if_rc;  wtIF_t if_cls;  wtIF_t if_lvl;  wtIF_t if_cls2;  wtIF_t if_lvl2;  wtIF_t if_cls3;  wtIF_t if_lvl3;  wtIF_t if_stat;  wtIF_t if_strat;  wtIF_t if_bg;  wtDELEGATE_t d_ifal;  wtDELEGATE_t d_ifgen;  wtDELEGATE_t d_ifrc;  wtDELEGATE_t d_ifcls;  wtDELEGATE_t d_iflvl;  wtDELEGATE_t d_ifcls2;  wtDELEGATE_t d_iflvl2;  wtDELEGATE_t d_ifcls3;  wtDELEGATE_t d_iflvl3;  wtDELEGATE_t d_ifstat;  wtDELEGATE_t d_ifstrat;  wtDELEGATE_t d_ifbg;  NPCGENERATOROPTS opts;  NPCGENERATOROPTS tempOpts;//putenv( "REQUEST_METHOD=GET" );//putenv( "QUERY_STRING=look=standard&stats_ability_bonuses=0&stats_ac_breakdown=1&stats_init_breakdown=1&stats_attack_breakdown=0&stats_save_breakdown=0&stats_skill_breakdown=0&stats_languages=1&stats_skillsfeats=1&stats_possessions=1&stats_spells=1&stats_formatting=1&alignment=anyg&class=cleric&level=any&gender=male&class2=&level2=any&race=hillg&class3=&level3=any&count=1&scorestrategy=1&background=Y&seed=" );  qDecoder();  action = qValueDefault( "generate", "action" );  if( strcmp( action, "pcgen" ) == 0 ) {    printf( "content-type: text/plain\r\n" );  } else {    printf( "content-type: text/html\r\n" );  }  printf( "Pragma: no-cache\r\n" );  printf( "Expires: Thu, 1 Jan 1970 00:00:01 GMT\r\n\r\n" );  if( qiValue( "configure" ) ) {    doStatBlockConfigure();    qFree();    return 0;  }    if( qiValue( "configsave" ) ) {    defon = "0";    defoff = "0";  } else {    defon = "1";    defoff = "0";  }     seed = qiValue( "seed" );  if( seed < 1 ) {    seed = time( NULL );    sprintf( url, "%s?%s%d", CGINAME, getenv( "QUERY_STRING" ), seed );  } else {    sprintf( url, "%s?%s", CGINAME, getenv( "QUERY_STRING" ) );  }    srand( seed );  alignment = qValueDefault( "any", "alignment" );  gender = qValueDefault( "any", "gender" );  race = qValueDefault( "anycore", "race" );  cls[0] = qValueDefault( "any", "class" );  level[0] = qValueDefault( "any", "level" );  cls[1] = qValueDefault( "", "class2" );  level[1] = qValueDefault( "", "level2" );  cls[2] = qValueDefault( "", "class3" );  level[2] = qValueDefault( "", "level3" );  stat = qValueDefault( "", "statblock" );  scnt = qValueDefault( "1", "count" );  count = qiValue( "count" );  strat = qValueDefault( "1", "scorestrategy" );  background = qValueDefault( "", "background" );  look = qValueDefault( "standard", "look" );  istrat = atoi( strat );  if( count < 1 ) {    count = 1;  }  if( count > 100 ) {    count = 100;  }  if_al.value = alignment;  if_al.neg = 0;  if_al.text = "SELECTED";  if_gen.value = gender;  if_gen.neg = 0;  if_gen.text = "SELECTED";  if_rc.value = race;  if_rc.neg = 0;  if_rc.text = "SELECTED";  if_cls.value = cls[0];  if_cls.neg = 0;  if_cls.text = "SELECTED";  if_lvl.value = level[0];  if_lvl.neg = 0;  if_lvl.text = "SELECTED";  if_cls2.value = cls[1];  if_cls2.neg = 0;  if_cls2.text = "SELECTED";  if_lvl2.value = level[1];  if_lvl2.neg = 0;  if_lvl2.text = "SELECTED";  if_cls3.value = cls[2];  if_cls3.neg = 0;  if_cls3.text = "SELECTED";  if_lvl3.value = level[2];  if_lvl3.neg = 0;  if_lvl3.text = "SELECTED";  if_stat.value = stat;  if_stat.neg = 0;  if_stat.text = "CHECKED";  if_strat.value = strat;  if_strat.neg = 0;  if_strat.text = "SELECTED";  if_bg.value = background;  if_bg.neg = 0;  if_bg.text = "CHECKED";  d_ifal.handler = wtConditionalHandler;  d_ifal.userData = &if_al;  d_ifgen.handler = wtConditionalHandler;  d_ifgen.userData = &if_gen;  d_ifrc.handler = wtConditionalHandler;  d_ifrc.userData = &if_rc;  d_ifcls.handler = wtConditionalHandler;  d_ifcls.userData = &if_cls;  d_iflvl.handler = wtConditionalHandler;  d_iflvl.userData = &if_lvl;  d_ifcls2.handler = wtConditionalHandler;  d_ifcls2.userData = &if_cls2;  d_iflvl2.handler = wtConditionalHandler;  d_iflvl2.userData = &if_lvl2;  d_ifcls3.handler = wtConditionalHandler;  d_ifcls3.userData = &if_cls3;  d_iflvl3.handler = wtConditionalHandler;  d_iflvl3.userData = &if_lvl3;  d_ifstat.handler = wtConditionalHandler;  d_ifstat.userData = &if_stat;  d_ifstrat.handler = wtConditionalHandler;  d_ifstrat.userData = &if_strat;  d_ifbg.handler = wtConditionalHandler;  d_ifbg.userData = &if_bg;  commify( buffer, getCounter() );  tags[0] = wtTagReplace( "COUNTER", buffer );  tags[1] = wtTagReplaceI( "SEED", seed );  tags[2] = wtTagReplace( "CGINAME", CGINAME );  tags[3] = wtTagDelegate( "ALIGNMENT", &d_ifal );  tags[4] = wtTagDelegate( "GENDER", &d_ifgen );  tags[5] = wtTagDelegate( "RACE", &d_ifrc );  tags[6] = wtTagDelegate( "CLASS", &d_ifcls );  tags[7] = wtTagDelegate( "LEVEL", &d_iflvl );   npc = 0;       if( qValueDefault( (char*)NULL, "alignment" ) != (char*)NULL ) {    logAccess( seed, alignment, gender, race, cls[0], level[0], cls[1], level[1], cls[2], level[2], count );    npc = (NPC**)malloc( count * sizeof( NPC* ) );    memset( &opts, 0, sizeof( opts ) );    if( strcmp( alignment, "any" ) == 0 ) {      opts.alignment = alANY;    } else if( strcmp( alignment, "anyl" ) == 0 ) {      opts.alignment = alANY_LAWFUL;    } else if( strcmp( alignment, "anyN" ) == 0 ) {      opts.alignment = alANY_LCNEUTRAL;    } else if( strcmp( alignment, "anyc" ) == 0 ) {      opts.alignment = alANY_CHAOTIC;    } else if( strcmp( alignment, "anyg" ) == 0 ) {      opts.alignment = alANY_GOOD;    } else if( strcmp( alignment, "anyn" ) == 0 ) {      opts.alignment = alANY_GENEUTRAL;    } else if( strcmp( alignment, "anye" ) == 0 ) {      opts.alignment = alANY_EVIL;    } else {      opts.alignment = 0;      switch( alignment[0] ) {        case 'l': opts.alignment |= alLAWFUL; break;        case 'n': opts.alignment |= alLCNEUTRAL; break;        case 'c': opts.alignment |= alCHAOTIC; break;      }      switch( alignment[1] ) {        case 'g': opts.alignment |= alGOOD; break;        case 'n': opts.alignment |= alGENEUTRAL; break;        case 'e': opts.alignment |= alEVIL; break;      }    }    if( strcmp( gender, "any" ) == 0 ) {      opts.gender = genderANY;    } else if( strcmp( gender, "male" ) == 0 ) {      opts.gender = gMALE;    } else {      opts.gender = gFEMALE;    }    for( i = 0; racetypes[ i ].name != 0; i++ ) {      if( strcmp( racetypes[ i ].name, race ) == 0 ) {        opts.raceType = racetypes[ i ].id;        break;      }    }    for( i = 0; i < 3; i++ ) {      if( *(cls[i]) == 0 ) {        continue;      }      if( strcmp( cls[i], "any" ) == 0 ) {        opts.classType[i] = classANY;      } else if( strcmp( cls[i], "anypc" ) == 0 ) {        opts.classType[i] = classANY_PC;      } else if( strcmp( cls[i], "anynpc" ) == 0 ) {        opts.classType[i] = classANY_NPC;      } else if( strcmp( cls[i], "barbarian" ) == 0 ) {        opts.classType[i] = pcBARBARIAN;      } else if( strcmp( cls[i], "bard" ) == 0 ) {        opts.classType[i] = pcBARD;      } else if( strcmp( cls[i], "cleric" ) == 0 ) {        opts.classType[i] = pcCLERIC;      } else if( strcmp( cls[i], "druid" ) == 0 ) {        opts.classType[i] = pcDRUID;      } else if( strcmp( cls[i], "fighter" ) == 0 ) {        opts.classType[i] = pcFIGHTER;      } else if( strcmp( cls[i], "monk" ) == 0 ) {        opts.classType[i] = pcMONK;      } else if( strcmp( cls[i], "paladin" ) == 0 ) {        opts.classType[i] = pcPALADIN;      } else if( strcmp( cls[i], "ranger" ) == 0 ) {        opts.classType[i] = pcRANGER;      } else if( strcmp( cls[i], "rogue" ) == 0 ) {        opts.classType[i] = pcROGUE;      } else if( strcmp( cls[i], "sorcerer" ) == 0 ) {        opts.classType[i] = pcSORCERER;      } else if( strcmp( cls[i], "wizard" ) == 0 ) {        opts.classType[i] = pcWIZARD;      } else if( strcmp( cls[i], "adept" ) == 0 ) {        opts.classType[i] = npcADEPT;      } else if( strcmp( cls[i], "aristocrat" ) == 0 ) {        opts.classType[i] = npcARISTOCRAT;      } else if( strcmp( cls[i], "commoner" ) == 0 ) {        opts.classType[i] = npcCOMMONER;      } else if( strcmp( cls[i], "expert" ) == 0 ) {        opts.classType[i] = npcEXPERT;      } else if( strcmp( cls[i], "warrior" ) == 0 ) {        opts.classType[i] = npcWARRIOR;      }      if( strcmp( level[i], "any" ) == 0 ) {        opts.level[i] = levelANY;      } else if( strcmp( level[i], "lo" ) == 0 ) {        opts.level[i] = levelLOW;      } else if( strcmp( level[i], "mid" ) == 0 ) {        opts.level[i] = levelMID;      } else if( strcmp( level[i], "hi" ) == 0 ) {        opts.level[i] = levelHI;      } else {        opts.level[i] = atoi( level[i] );        if( opts.level[i] < 1 ) {          opts.level[i] = 1;        }        if( opts.level[i] > 20 ) {          opts.level[i] = 20;        }      }    }    opts.filePath = TEMPATH;    opts.abilityScoreStrategy = strategies[ istrat ];    for( i = 0; i < count; i++ ) {      memcpy( &tempOpts, &opts, sizeof( tempOpts ) );      npc[i] = npcGenerateNPC( &tempOpts );    }    npcDesc.handler = displayNPC;    npcDesc.userData = npc;    tags[8] = wtTagDelegate( "NPCDESC", &npcDesc );  } else {    logAccess( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );    tags[8] = wtTagReplace( "NPCDESC", "" );  }  tags[9] = wtTagDelegate( "CLASS2", &d_ifcls2 );  tags[10] = wtTagDelegate( "LEVEL2", &d_iflvl2 );  tags[11] = wtTagDelegate( "CLASS3", &d_ifcls3 );  tags[12] = wtTagDelegate( "LEVEL3", &d_iflvl3 );  tags[13] = wtTagDelegate( "STATBLOCK", &d_ifstat );  tags[14] = wtTagReplace( "COUNT", scnt );  tags[15] = wtTagReplace( "STATSABILITYBONUSES", qValueDefault( defoff, "stats_ability_bonuses" ) );  tags[16] = wtTagReplace( "STATSACBREAKDOWN", qValueDefault( defon, "stats_ac_breakdown" ) );  tags[17] = wtTagReplace( "STATSINITBREAKDOWN", qValueDefault( defon, "stats_init_breakdown" ) );  tags[18] = wtTagReplace( "STATSATTACKBREAKDOWN", qValueDefault( defoff, "stats_attack_breakdown" ) );  tags[19] = wtTagReplace( "STATSSAVEBREAKDOWN", qValueDefault( defoff, "stats_save_breakdown" ) );  tags[20] = wtTagReplace( "STATSSKILLBREAKDOWN", qValueDefault( defoff, "stats_skill_breakdown" ) );  tags[21] = wtTagReplace( "STATSLANGUAGES", qValueDefault( defon, "stats_languages" ) );  tags[22] = wtTagReplace( "STATSSKILLSFEATS", qValueDefault( defon, "stats_skillsfeats" ) );  tags[23] = wtTagReplace( "STATSPOSSESSIONS", qValueDefault( defon, "stats_possessions" ) );  tags[24] = wtTagReplace( "STATSSPELLS", qValueDefault( defon, "stats_spells" ) );  tags[25] = wtTagReplace( "STATSFORMATTING", qValueDefault( defon, "stats_formatting" ) );  tags[26] = wtTagDelegate( "SCORESTRATEGY", &d_ifstrat );  tags[27] = wtTagDelegate( "BACKGROUND", &d_ifbg );  tags[28] = wtTagReplace( "LOOK", look );  tags[29] = 0;  if( qiValue( "printable" ) ) {    tem = getLookAndFeel( qValueDefault( "standard", "look" ) )->printable;  } else {    tem = getLookAndFeel( qValueDefault( "standard", "look" ) )->main;  }      if( strcmp( action, "pcgen" ) == 0 ) {    stream = wtOpenFileStreamFromHandle( stdout );    convertToPCGen( npc[0], stream );    wtCloseStream( stream );  } else {    wtWriteTemplateToFile( stdout, tem, tags );  }  wtFreeTagList( tags );  if( npc != 0 ) {    for( i = 0; i < count; i++ ) {      npcDestroyNPC( npc[i] );    }    free( npc );  }  qFree();  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -