Advertisement
Guest User

Untitled

a guest
Oct 12th, 2014
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. --- tech.c~ 2014-07-19 16:36:22.000000000 +0300
  2. +++ tech.c 2014-10-12 10:09:34.570275222 +0300
  3. @@ -291,15 +291,23 @@
  4. pplayer may be NULL in which case a simplified result is returned
  5. (used by the client).
  6. **************************************************************************/
  7. -bool player_invention_reachable(const struct player *pplayer,
  8. +bool cached_player_invention_reachable(const struct player *pplayer,
  9. const Tech_type_id tech,
  10. - bool allow_prereqs)
  11. + bool allow_prereqs,
  12. + int (*cached_result)[2])
  13. {
  14. +#define CACHE_AND_RETURN_INVENTION(result) \
  15. + cached_result[tech][allow_prereqs] = (result); \
  16. + return cached_result[tech][allow_prereqs]
  17. +
  18. Tech_type_id root;
  19.  
  20. if (!valid_advance_by_number(tech)) {
  21. return FALSE;
  22. }
  23. + if(cached_result[tech][allow_prereqs] >= 0) {
  24. + return cached_result[tech][allow_prereqs];
  25. + }
  26.  
  27. root = advance_required(tech, AR_ROOT);
  28. if (A_NONE != root) {
  29. @@ -308,32 +316,48 @@
  30. * (init_techs, lua script, ...).
  31. * If you already know it, you can "reach" it; if not, not. (This case
  32. * is needed for descendants of this tech.) */
  33. - return TECH_KNOWN == player_invention_state(pplayer, tech);
  34. + CACHE_AND_RETURN_INVENTION(TECH_KNOWN == player_invention_state(pplayer, tech));
  35. } else if (allow_prereqs) {
  36. /* Recursive check if the player can ever reach this tech (root tech
  37. * and both requirements). */
  38. - return (player_invention_reachable(pplayer, root, TRUE)
  39. - && player_invention_reachable(pplayer,
  40. + CACHE_AND_RETURN_INVENTION (cached_player_invention_reachable(pplayer, root, TRUE, cached_result)
  41. + && cached_player_invention_reachable(pplayer,
  42. advance_required(tech, AR_ONE),
  43. - allow_prereqs)
  44. - && player_invention_reachable(pplayer,
  45. + allow_prereqs,
  46. + cached_result)
  47. + && cached_player_invention_reachable(pplayer,
  48. advance_required(tech, AR_TWO),
  49. - allow_prereqs));
  50. + allow_prereqs,
  51. + cached_result));
  52. } else if (TECH_KNOWN != player_invention_state(pplayer, root)
  53. - || !player_invention_reachable(pplayer,
  54. + || !cached_player_invention_reachable(pplayer,
  55. advance_required(tech, AR_ONE),
  56. - allow_prereqs)
  57. - || !player_invention_reachable(pplayer,
  58. + allow_prereqs,
  59. + cached_result)
  60. + || !cached_player_invention_reachable(pplayer,
  61. advance_required(tech, AR_TWO),
  62. - allow_prereqs)) {
  63. + allow_prereqs,
  64. + cached_result)) {
  65. /* This tech requires knowledge of another tech (root tech or recursive
  66. * a root tech of a requirement) before being available. Prevents
  67. * sharing of untransferable techs. */
  68. - return FALSE;
  69. + CACHE_AND_RETURN_INVENTION(FALSE);
  70. }
  71. }
  72.  
  73. - return TRUE;
  74. + CACHE_AND_RETURN_INVENTION(TRUE);
  75. +}
  76. +
  77. +bool player_invention_reachable(const struct player *pplayer,
  78. + const Tech_type_id tech,
  79. + bool allow_prereqs)
  80. +{
  81. + int cached_result[game.control.num_tech_types][2];
  82. + int i;
  83. + for(i=0; i<game.control.num_tech_types; i++) {
  84. + cached_result[i][false] = cached_result[i][true] = -1;
  85. + }
  86. + return cached_player_invention_reachable(pplayer, tech, allow_prereqs, cached_result);
  87. }
  88.  
  89. /**************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement