Bug #1611 ยป 0022-savegame-Respect-savegame-item-order-when-loading-ac.patch
| server/savegame/savegame3.c | ||
|---|---|---|
|                      "Undefined value '%c' within 'game.global_advances'.", | ||
|                      str[i]); | ||
|       if (str[i] == '1') { | ||
|         struct advance *padvance = | ||
|             advance_by_rule_name(loading->technology.order[i]); | ||
|         struct advance *padvance | ||
|           = advance_by_rule_name(loading->technology.order[i]); | ||
|         if (padvance != NULL) { | ||
|           game.info.global_advances[advance_number(padvance)] = TRUE; | ||
| ... | ... | |
|                    "'players.destroyed_wonders'.", str[k]); | ||
|     if (str[k] == '1') { | ||
|       struct impr_type *pimprove = | ||
|           improvement_by_rule_name(loading->improvement.order[k]); | ||
|       if (pimprove) { | ||
|       struct impr_type *pimprove | ||
|         = improvement_by_rule_name(loading->improvement.order[k]); | ||
|       if (pimprove != NULL) { | ||
|         game.info.great_wonder_owners[improvement_index(pimprove)] | ||
|           = WONDER_DESTROYED; | ||
|       } | ||
| ... | ... | |
|           switch (action_id_get_sub_target_kind(order->action)) { | ||
|           case ASTK_BUILDING: | ||
|             /* Sub target is a building. */ | ||
|             if (!improvement_by_number(order_sub_tgt)) { | ||
|             if (order_sub_tgt < 0 | ||
|                 || order_sub_tgt >= loading->improvement.size | ||
|                 || !loading->improvement.order[order_sub_tgt]) { | ||
|               /* Sub target is invalid. */ | ||
|               log_sg("Cannot find building %d for %s to %s", | ||
|                      order_sub_tgt, unit_rule_name(punit), | ||
|                      action_id_name_translation(order->action)); | ||
|               order->sub_target = B_LAST; | ||
|             } else { | ||
|               order->sub_target = order_sub_tgt; | ||
|               struct impr_type *pimprove | ||
|                 = improvement_by_rule_name(loading->improvement.order[order_sub_tgt]); | ||
|               if (pimprove != NULL) { | ||
|                 order->sub_target = improvement_index(pimprove); | ||
|               } | ||
|             } | ||
|             break; | ||
|           case ASTK_TECH: | ||
|             /* Sub target is a technology. */ | ||
|             if (order_sub_tgt == A_NONE | ||
|                 || (!valid_advance_by_number(order_sub_tgt) | ||
|                     && order_sub_tgt != A_FUTURE)) { | ||
|               /* Target tech is invalid. */ | ||
|               log_sg("Cannot find tech %d for %s to steal", | ||
|                      order_sub_tgt, unit_rule_name(punit)); | ||
|               order->sub_target = A_NONE; | ||
|             } else { | ||
|               order->sub_target = order_sub_tgt; | ||
|             { | ||
|               bool failure = order_sub_tgt < 0 | ||
|                 || order_sub_tgt >= loading->technology.size | ||
|                 || !loading->technology.order[order_sub_tgt]; | ||
|               struct advance *padvance = NULL; | ||
|               if (!failure) { | ||
|                 padvance = advance_by_rule_name(loading->technology.order[order_sub_tgt]); | ||
|               } | ||
|               if (padvance == NULL) { | ||
|                 /* Target tech is invalid. */ | ||
|                 log_sg("Cannot find tech %d for %s to steal", | ||
|                        order_sub_tgt, unit_rule_name(punit)); | ||
|                 order->sub_target = A_NONE; | ||
|               } else { | ||
|                 order->sub_target = advance_index(padvance); | ||
|               } | ||
|             } | ||
|             break; | ||
|           case ASTK_EXTRA: | ||
| ... | ... | |
|         if (order->order == ORDER_ACTIVITY || action_wants_extra) { | ||
|           enum unit_activity act; | ||
|           if (order_sub_tgt < 0 || order_sub_tgt >= loading->extra.size) { | ||
|           if (order_sub_tgt < 0 || order_sub_tgt >= loading->extra.size | ||
|               || !loading->extra.order[order_sub_tgt]) { | ||
|             if (order_sub_tgt != EXTRA_NONE) { | ||
|               log_sg("Cannot find extra %d for %s to build", | ||
|                      order_sub_tgt, unit_rule_name(punit)); | ||
| ... | ... | |
|             order->sub_target = EXTRA_NONE; | ||
|           } else { | ||
|             order->sub_target = order_sub_tgt; | ||
|             order->sub_target = extra_index(loading->extra.order[order_sub_tgt]); | ||
|           } | ||
|           /* An action or an activity may require an extra target. */ | ||
| ... | ... | |
|                      str[j], i); | ||
|       if (str[j] == '1') { | ||
|         struct advance *padvance = | ||
|             advance_by_rule_name(loading->technology.order[j]); | ||
|         struct advance *padvance | ||
|           = advance_by_rule_name(loading->technology.order[j]); | ||
|         if (padvance) { | ||
|           research_invention_set(presearch, advance_number(padvance), | ||