diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html index 1677a31b4..4bca42489 100644 --- a/doc/ChangeLog.html +++ b/doc/ChangeLog.html @@ -473,7 +473,6 @@ <LI>Fixed build.bat (from Ari) <LI>The main CCL file "freecraft.ccl" first looked up in $HOME/.freecraft. </UL> -<A NAME="current"> </A> <P><LI>Version 1.17 <UL> <LI>Distribution archive renamed to "freecraft". @@ -820,6 +819,7 @@ <LI>Added Alt-Buttons: second set of buttons are available on pressed Alt-key. </UL> +<A NAME="current"> </A> <P><LI>Version 1.17.1 <UL> <LI><B>1.17.1pre1</B> @@ -873,6 +873,13 @@ <LI>Added Global Options, can change resolution, fog mode, and fullscreen mode. </UL> +<P><LI>Version 1.17.2 or 1.18 + <UL> + <LI>Fixed multiplayer fog of war (from Jimmy Salmon). + <LI>Added free for all, top vs bottom, and left vs right game types (from + Jimmy Salmon). + <LI>Added if-resource trigger (from Jimmy Salmon). + </UL> </UL> <HR> diff --git a/src/game/trigger.cpp b/src/game/trigger.cpp index 5b2d05512..6074d01ed 100644 --- a/src/game/trigger.cpp +++ b/src/game/trigger.cpp @@ -480,6 +480,99 @@ local SCM CclIfOpponents(SCM player,SCM operation,SCM quantity) return SCM_BOOL_F; } +/** +** Player has the quantity of resource. +*/ +local SCM CclIfResource(SCM player,SCM operation,SCM quantity,SCM resource) +{ + int plynr; + int q; + int pn; + const char* res; + const char* op; + CompareFunction Compare; + + plynr=TriggerGetPlayer(player); + op=get_c_string(operation); + q=gh_scm2int(quantity); + res=get_c_string(resource); + + Compare=GetCompareFunction(op); + if( !Compare ) { + fprintf(stderr,"Illegal comparison operation in if-unit: %s\n",op); + Exit(1); + } + + if( plynr==-1 ) { + plynr=0; + pn=PlayerMax; + } else { + pn=plynr+1; + } + + if( !strcmp(res, DEFAULT_NAMES[GoldCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[GoldCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, DEFAULT_NAMES[WoodCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[WoodCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, DEFAULT_NAMES[OilCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[OilCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, DEFAULT_NAMES[OreCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[OreCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, DEFAULT_NAMES[StoneCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[StoneCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, DEFAULT_NAMES[CoalCost]) ) { + for( ; plynr<pn; ++plynr ) { + if( Compare(Players[plynr].Resources[CoalCost],q) ) { + return SCM_BOOL_T; + } + } + } else if( !strcmp(res, "all") ) { + int j; + int sum; + + for( ; plynr<pn; ++plynr ) { + for( j=1,sum=0; j<MaxCosts; ++j ) { + sum += Players[plynr].Resources[j]; + } + } + if( Compare(sum,q) ) { + return SCM_BOOL_T; + } + } else if( !strcmp(res, "any") ) { + int j; + + for( ; plynr<pn; ++plynr ) { + for( j=1; j<MaxCosts; ++j ) { + if( Compare(Players[plynr].Resources[j],q) ) { + return SCM_BOOL_T; + } + } + } + } + + return SCM_BOOL_F; +} + // -------------------------------------------------------------------------- // Actions @@ -573,6 +666,7 @@ global void TriggerCclRegister(void) gh_new_procedure5_0("if-near-unit",CclIfNearUnit); gh_new_procedure5_0("if-rescued-near-unit",CclIfRescuedNearUnit); gh_new_procedure3_0("if-opponents",CclIfOpponents); + gh_new_procedure4_0("if-resource",CclIfResource); // Actions gh_new_procedure0_0("action-victory",CclActionVictory); gh_new_procedure0_0("action-defeat",CclActionDefeat);