📄 npccgi.c
字号:
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 + -