Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- tech.c~ 2014-07-19 16:36:22.000000000 +0300
- +++ tech.c 2014-10-12 10:09:34.570275222 +0300
- @@ -291,15 +291,23 @@
- pplayer may be NULL in which case a simplified result is returned
- (used by the client).
- **************************************************************************/
- -bool player_invention_reachable(const struct player *pplayer,
- +bool cached_player_invention_reachable(const struct player *pplayer,
- const Tech_type_id tech,
- - bool allow_prereqs)
- + bool allow_prereqs,
- + int (*cached_result)[2])
- {
- +#define CACHE_AND_RETURN_INVENTION(result) \
- + cached_result[tech][allow_prereqs] = (result); \
- + return cached_result[tech][allow_prereqs]
- +
- Tech_type_id root;
- if (!valid_advance_by_number(tech)) {
- return FALSE;
- }
- + if(cached_result[tech][allow_prereqs] >= 0) {
- + return cached_result[tech][allow_prereqs];
- + }
- root = advance_required(tech, AR_ROOT);
- if (A_NONE != root) {
- @@ -308,32 +316,48 @@
- * (init_techs, lua script, ...).
- * If you already know it, you can "reach" it; if not, not. (This case
- * is needed for descendants of this tech.) */
- - return TECH_KNOWN == player_invention_state(pplayer, tech);
- + CACHE_AND_RETURN_INVENTION(TECH_KNOWN == player_invention_state(pplayer, tech));
- } else if (allow_prereqs) {
- /* Recursive check if the player can ever reach this tech (root tech
- * and both requirements). */
- - return (player_invention_reachable(pplayer, root, TRUE)
- - && player_invention_reachable(pplayer,
- + CACHE_AND_RETURN_INVENTION (cached_player_invention_reachable(pplayer, root, TRUE, cached_result)
- + && cached_player_invention_reachable(pplayer,
- advance_required(tech, AR_ONE),
- - allow_prereqs)
- - && player_invention_reachable(pplayer,
- + allow_prereqs,
- + cached_result)
- + && cached_player_invention_reachable(pplayer,
- advance_required(tech, AR_TWO),
- - allow_prereqs));
- + allow_prereqs,
- + cached_result));
- } else if (TECH_KNOWN != player_invention_state(pplayer, root)
- - || !player_invention_reachable(pplayer,
- + || !cached_player_invention_reachable(pplayer,
- advance_required(tech, AR_ONE),
- - allow_prereqs)
- - || !player_invention_reachable(pplayer,
- + allow_prereqs,
- + cached_result)
- + || !cached_player_invention_reachable(pplayer,
- advance_required(tech, AR_TWO),
- - allow_prereqs)) {
- + allow_prereqs,
- + cached_result)) {
- /* This tech requires knowledge of another tech (root tech or recursive
- * a root tech of a requirement) before being available. Prevents
- * sharing of untransferable techs. */
- - return FALSE;
- + CACHE_AND_RETURN_INVENTION(FALSE);
- }
- }
- - return TRUE;
- + CACHE_AND_RETURN_INVENTION(TRUE);
- +}
- +
- +bool player_invention_reachable(const struct player *pplayer,
- + const Tech_type_id tech,
- + bool allow_prereqs)
- +{
- + int cached_result[game.control.num_tech_types][2];
- + int i;
- + for(i=0; i<game.control.num_tech_types; i++) {
- + cached_result[i][false] = cached_result[i][true] = -1;
- + }
- + return cached_player_invention_reachable(pplayer, tech, allow_prereqs, cached_result);
- }
- /**************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement